찾다

 >  Q&A  >  본문

데이터베이스 열에 구분된 목록을 저장하는 것이 정말 그렇게 나쁜가요?

<p>체크박스 세트(모두 또는 일부를 선택할 수 있음)가 있는 웹 양식을 상상해 보십시오. 나는 데이터베이스 테이블의 열에 저장된 쉼표로 구분된 값 목록에 저장하기로 결정했습니다. </p> <p>이제 올바른 해결책은 두 번째 테이블을 만들고 데이터베이스를 올바르게 정규화하는 것임을 알았습니다. 간단한 솔루션을 구현하는 것이 더 빠르고, 너무 많은 시간을 들이지 않고도 애플리케이션의 개념 증명을 빠르게 얻고 싶습니다. </p> <p>제 경우에는 시간 절약과 간단한 코드가 그만한 가치가 있다고 생각합니다. 이것이 합리적인 디자인 선택입니까, 아니면 처음부터 표준화해야 합니까? </p> <p>자세한 내용을 설명하자면 이는 기본적으로 공유 폴더에 저장된 Excel 파일을 대체하는 작은 내부 응용 프로그램입니다. 저도 프로그램을 정리하고 유지관리를 더 쉽게 만들려고 생각해서 이런 질문을 하게 되었습니다. 제가 별로 만족하지 못하는 몇 가지 사항이 있는데, 그 중 하나가 이 질문의 주제입니다. </p>
P粉020556231P粉020556231483일 전501

모든 응답(2)나는 대답할 것이다

  • P粉948258958

    P粉9482589582023-08-28 11:49:53

    "이유 중 하나는 게으름입니다".

    모닝콜입니다. 이와 같은 일을 해야 하는 유일한 이유는 "올바른 방법"을 수행하는 방법을 알고 있지만 그렇게 하지 말아야 할 확실한 이유가 있다고 결론을 내리기 때문입니다.

    즉, 이 방식으로 저장하기로 선택한 데이터가 쿼리할 필요가 전혀 없는 데이터라면 선택한 방식으로 저장하는 경우가 있을 수 있습니다.

    (일부 사용자는 "미래에 어떤 요구 사항이 추가될지 전혀 알 수 없습니다"라고 말하면서 이전 단락의 내 진술에 문제를 제기할 것입니다. 이러한 사용자는 잘못된 정보를 얻었거나 종교적 신념을 진술한 것입니다. 때로는 요구사항이 앞에 있습니다 )

    회신하다
    0
  • P粉545956597

    P粉5459565972023-08-28 09:02:45

    1차 정규형을 위반하는 것 외에도, 반복되는 그룹 값의 열이 쉼표로 구분된 단일 목록에 저장되는 데에는 더 많은 실질적인 문제가 있습니다.

      모든 값이 올바른 데이터 유형인지 확인할 수 있는 방법은 없습니다.
    • 1,2,3,banana,5를 방지할 수 없습니다.
    • 외래 키 제약 조건을 사용하여 값을 조회 테이블에 연결할 수 없으며 참조 무결성을 적용할 수 없습니다.
    • 고유성을 강제할 수 없음: 차단할 수 없음
    • 1,2,3,3,3,5
    • 전체 목록을 가져오지 않으면 목록에서 값을 제거할 수 없습니다.
    • 저장된 목록의 길이는 문자열 열의 길이를 초과할 수 없습니다.
    • 주어진 값을 가진 목록의 모든 항목을 검색하는 것은 어렵습니다. 따라서 비효율적인 테이블 스캔을 사용해야 합니다. 예를 들어 MySQL에서는 정규식을 사용해야 할 수도 있습니다.

    • idlist REGEXP '[[:<:]]2[[:>:]]' 或在 MySQL 8.0 中:idlist REGEXP '\b2\b' 목록의 요소 개수를 계산하거나 다른 집계 쿼리를 수행하는 것은 어렵습니다.
    • 값이 참조하는 조회 테이블에 값을 연결하는 것은 어렵습니다.
    • 목록을 순서대로 정렬하기가 어렵습니다.
    • 값에 표시되지 않는 것이 보장되는 구분 기호를 선택하기는 어렵습니다
    이러한 문제를 해결하려면 많은 애플리케이션 코드를 작성하고 RDBMS가 이미 제공하는 보다 효율적인 기능을 다시 개발해야 합니다.

    쉼표로 구분된 목록이 잘못되어 이를 내 책의 첫 번째 장으로 만들었습니다:

    SQL 안티 패턴, 볼륨 1: 데이터베이스 프로그래밍의 함정 피하기.

    비정규화가 필요한 경우가 있지만

    @OMG Ponies가 언급한 것처럼 이는 예외입니다. 비관계형 "최적화"는 데이터의 다른 사용을 희생하면서 한 유형의 쿼리에 도움이 되므로, 비정규화할 가치가 있도록 특별한 처리가 필요한 쿼리가 무엇인지 확인해야 합니다.

    회신하다
    0
  • 취소회신하다