2010-07-28 2 views
1

봄/겨울잠을 사용하여 웹 응용 프로그램을 만들 계획입니다.PostgreSQL에서 상속을 디자인하기위한 유형 열을 추가해야합니까?

상속을 지원하기 위해 내 postgresql 데이터베이스를 어떻게 디자인해야합니까?
다음 표가 있다고 가정합니다 : super_table, sub_table_1, sub_table_2.
그런 다음 sub_table_1 및 subtable_2는 super_table을 상속합니다.

super_table의 행이 sub_table_1 또는 sub_table_2 인 경우
을 알 수 있도록 유형 열 (예 : char 또는 int)을 추가해야합니까?

알려 주시기 바랍니다. 감사.

CREATE TABLE Super_Table (
    super_id SERIAL PRIMARY KEY, 
    sub_type CHAR(1) NOT NULL, 
    UNIQUE KEY (super_id, sub_type) 
); 

CREATE TABLE Sub_Table_A (
    super_id PRIMARY KEY, 
    sub_type CHAR(1) NOT NULL, 
    CHECK (sub_type = 'A'), 
    FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type) 
); 

CREATE TABLE Sub_Table_B (
    super_id PRIMARY KEY, 
    sub_type CHAR(1) NOT NULL, 
    CHECK (sub_type = 'B'), 
    FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type) 
); 

지금 Super_Table의 행이 모두 하위 테이블에 행에서 참조 할 수있는 방법이 없습니다 :

+1

어떤 문제가 있습니까? Spring/Hibernate의 상속은 PostgreSQL과 다른 범위를 가지고 있습니다. 당신이 가지고 있지 않은 문제를 해결하려고하지 마십시오, 당신은 진짜 문제로 끝날 것입니다. –

답변

3

확실히 당신은 하나 개의 서브 테이블이 지정된 행을 참조 할 수 있음을 시행 예를 들어이 작업을 수행 할 수 있습니다 . Super_Table의 행에는 'A'또는 'B'가 있어야하며 서브 테이블 중 하나만 외래 키 참조를 충족시킬 수 있습니다. 귀하의 코멘트를 다시


:

나의 이해 상속의 현재 PostgreSQL의 구현은 인덱스, 독특한 constaints 및 외부 키 제한 조건에 관련된 이상 현상들을 수 있다는 것입니다. 이 기능을 사용하는 것은 까다 롭고 오류가 발생하기 쉽습니다.

기본적으로 인덱스가 단일 테이블에만 존재하기 때문에 부모 테이블에 고유 한 제약 조건이있는 경우 부모와 그 모든 자식에 대해 고유성을 적용하려면 어떻게해야합니까? 자식은 이미 부모에있는 테이블에 값을 삽입 할 수도 있고 부모가 자식 중 하나에 이미있는 값을 삽입 할 수도 있습니다.

마찬가지로 외래 키는 동일한 기본 키 또는 고유 값을 가진 상위/하위에 여러 행이있을 수있는 경우에 참조되는 행이 모호하기 때문에 상위 테이블 및/또는 하위를 참조 할 수 없습니다.

이들은 PostgreSQL의 불명예의 알려진 문제점과 해결되지 않은 제한 사항입니다. 위의 디자인은 기본 키 문제를 해결하지만 보조 고유 키 문제는 해결하지 않습니다.

http://archives.postgresql.org/pgsql-hackers/2010-05/msg00285.php

+0

나는 INHERITS를 사용할 생각이었습니다. 이것이 가능한가? – geffchang

+0

http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch에서 한두 가지를 정리할 수 있습니다. – AlexRednic

관련 문제