복붙노트

[SQL] 하나의 열에 배열 또는 여러 값을 저장하는 방법

SQL

하나의 열에 배열 또는 여러 값을 저장하는 방법

포스트 그레스 7.4을 실행 (그래 우리는 업그레이드의 중간에 있습니다)

나는 데이터베이스에 하나 개의 필드에 1에서 100 선택한 항목에서 저장해야합니다. 시간 그것의 98 %는 1 개 항목을 입력 할 것, 시간 (해당되는 경우) 여러 항목이있을 것의 2 %입니다.

항목은 30 명 이상의 자 아무것도 (지금 현재) 텍스트 설명보다 더 아무것도 없다. 그들은 사용자가 선택 정적 값이다.

원하는 데이터를 저장하는 데 최적의 열 데이터 형식을 알고 싶어. 나는 BLOB를 생각하지만, 이것은 과잉 인 경우 몰랐다. 어쩌면 JSON?

우리가 포스트 그레스 7.4을 실행하고 있기 때문에 또한 나는 ENUM 생각 않았지만, 지금의 나는 정말이 작업을 수행 할 수 없습니다

나는 또한 쉽게 맵이없는 또는 참조 테이블 있도록 입력 항목 (들)을 식별 할 수 싶었다.

해결법

  1. ==============================

    1.당신은 여기에 몇 가지 질문을 가지고, 그래서 개별적으로 해결합니다 :

    당신은 여기에 몇 가지 질문을 가지고, 그래서 개별적으로 해결합니다 :

    내 일반적인 규칙은 다음과 같습니다하지 않습니다. 이것은 무언가이다 제외한 모든 외래 키와 두 번째 테이블 (또는 세 번째)가 필요합니다. 물론, 지금은 쉽게 보일 수 있지만, 어떤 유스 케이스가 개별적으로 해당 항목에 대한 사실 조회에 필요로하는 곳에 함께 온다면? 그것은 또한 당신이 게으른 인스턴스에 대한 더 많은 옵션을 가지고 있다는 것을 의미하고 여러 프레임 워크 / 언어에서보다 일관된 경험이 있습니다. 또한, 당신은 (30,000 문자가 많이있다) 연결 시간 초과 문제가 가능성이 적습니다.

    당신은 당신이 ENUM을 사용하는 방법에 대해 생각하고 있다고 언급했다. 이 값은 고정하고 있습니까? 당신은 미리를 알고 계십니까? 이 내 구조 될 수 있도록하는 경우 :

    자료 표 (당신은 지금 무엇을) :

    | id primary_key sequence
    | -- other columns here.
    

    항목 테이블 :

    | id primary_key sequence
    | descript VARCHAR(30) UNIQUE
    

    지도 테이블 :

    | base_id  bigint
    | items_id bigint
    

    지도 테이블은 너무 기본 테이블에지도를 BASE_ID 외부 키를 가지고 것이며, items_id는 항목 테이블에 매핑합니다.

    당신은 DB에서이를 검색 할 수있는 쉬운 방법을 원하는 경우에, 다음 조인 않는보기를 만들 수 있습니다. 당신은 당신이 실질적으로 하나 개의 테이블을 처리하고 너무 삽입 및 업데이트 규칙을 만들 수 있습니다.

    당신이 그런 짓을해야하는 경우, 왜 그냥 문자 묘사 문자열을 사용? 그것은 CSV, XML 또는 JSON보다 적은 프로세싱 파워를 취할 것, 그것은 짧아집니다.

    개인적으로, 나는 텍스트를 사용합니다. 당신이 BLOB, 그리고 TEXT, 내 경험에서, 당신은 IDE의 형태를 사용하는 경우 쉽게 읽을이 만들어 많이 얻을 것처럼 소리가 나지 않습니다.

  2. ==============================

    2.그런데, 최근 포스트 그레스 버전 배열 형 (PG 7.4 약 100 %)가있다. 당신은 GIN 또는 GIST 인덱스를 사용하여 인덱스를을 균일하게 할 수 있습니다. 신택스는 다음과 같습니다

    그런데, 최근 포스트 그레스 버전 배열 형 (PG 7.4 약 100 %)가있다. 당신은 GIN 또는 GIST 인덱스를 사용하여 인덱스를을 균일하게 할 수 있습니다. 신택스는 다음과 같습니다

    create table foo (
      bar  int[] default '{}'
    );
    
    select * from foo where bar && array[1] -- equivalent to bar && '{1}'::int[]
    
    create index on foo using gin (bar); -- allows to use an index in the above query
    

    이전의 대답에서 알 수 있듯이, 제대로 정상화 더 좋을 것이다.

  3. from https://stackoverflow.com/questions/6360739/how-to-store-array-or-multiple-values-in-one-column by cc-by-sa and MIT license