각각 외래 키인 요소의 PostgreSQL 배열


83

내 앱에 대한 DB를 만들려고 시도하고 있는데 가장 좋은 방법을 찾고 싶은 것은 Users나와 Items테이블 사이에 일대 다 관계를 만드는 것 입니다.

나는 세 번째 테이블을 만들 수 있습니다 알고 ReviewedItems, 그리고 열이 할 수있는 UserID와 ItemID, 그러나의 열을 할 수 있는지 나는 알고 싶습니다 Users의 말을하자, reviewedItems외국 키가 포함 된 정수 배열 인 Items것을 을 User검토하고있다.

PostgreSQL이이 작업을 수행 할 수 있다면 알려주세요! 그렇지 않다면 세 번째 테이블 경로로 내려갈 것입니다.


3
이 기능을 Postgres에 추가하는 패치가 있습니다. blog.2ndquadrant.com/…(2012 ) 및 postgresql.org/message-id/…(2017 )를 참조하십시오 . 아직 승인되지 않았지만 언젠가는 희망이 있습니다.
Simon Kissane 2017 년

답변:


68

아니요, 불가능합니다.

PostgreSQL은 적절하게 정규화 된 데이터 모델에서 가장 효율적으로 작동 하는 관계형 DBMS입니다. 배열은 정의에 따라 정렬 된 집합입니다. 관계형 데이터 구조가 아니므로 SQL 표준은 배열 요소에 대한 외래 키 정의를 지원하지 않으며 PostgreSQL도 지원하지 않습니다.

그러나 다른 테이블의 기본 키에 연결되는 배열 요소를 사용하여 완벽하게 정밀한 데이터베이스를 구축 할 수 있습니다. 그러나 이러한 배열 요소는 외래 키로 선언 할 수 없으므로 DBMS는 참조 무결성을 유지하지 않습니다.


3
이를 확인하는 제약 트리거를 정의 할 수 있습니다 . 그러나 모든 경우에 안정적으로 작동하는지 확실하지 않습니다.
a_horse_with_no_name

@a_horse_with_no_name :에 대한 예를 들어 주실 수 reliably in all cases있습니까? 때때로 트리거가 실패 할 수 있다는 뜻입니까? 감사.
Luan Huynh

1
@LuanHuynh : (기술적) 세부 사항은 기억 나지 않지만 메일 링리스트에서 이것이 마지막으로 논의되었을 때 누군가가 해당 제약 트리거가 모든 경우를 포착하지는 않을 수 있다고 언급했지만 더 이상 사실이 아닐 수도 있습니다
a_horse_with_no_name

덕분에, 난 그냥 그들을 위해 관계 테이블을 만들 겠네
자크

1
@a_horse_with_no_name 이러한 제약의 예를 들어 답변을 게시 할 수 있습니까?
OrangeDog

65

곧 이것을 할 수있을 것입니다 : https://commitfest.postgresql.org/17/1252/-Mark Rofail이이 패치에 대해 훌륭한 작업을하고 있습니다!

패치는 (완료되면)

CREATE TABLE PKTABLEFORARRAY (
    ptest1 float8 PRIMARY KEY,
    ptest2 text
);
CREATE TABLE FKTABLEFORARRAY (
    ftest1 int[],
    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY,
    ftest2 int
);

그러나 작성자는 현재 패치를 리베이스하는 데 도움이 필요하므로 (내 능력을 넘어서) Postgres 내부를 아는이 글을 읽는 사람은 가능한 경우 도움을 주시기 바랍니다.


8
참으로 매우 HOT ...CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int )
Victor

1
패치는 작성자의 후속 조치를 기다리고 있습니다. 기능을 사용할 수있을 때까지 트리거를 사용하여 느릴 수있는 무결성을 확인해야합니다.
yoonghm

34
수치, :( 포함 된 것으로 보인다되지 않습니다
Teocali

6
2020, 아직 지원되지
않음
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.