2012-12-04 4 views
0

한 테이블의 행에 다른 테이블의 행이 일치해야하고 그 반대의 경우도 적용해야합니다. 나는 현재 당신이 아직 만들지 않은 테이블을 참조 할 수 없다는 사실을 피하기 위해 이렇게하고있다. 내가 모르는 더 자연스러운 방법이 있습니까?PostgreSQL에서 순환 제약을 어떻게 구현합니까?

CREATE TABLE LE (id int PRIMARY KEY); 
CREATE TABLE LE_TYP (id int PRIMARY KEY, typ text); 

ALTER TABLE LE ADD CONSTRAINT 
    twowayref FOREIGN KEY (id) REFERENCES LE_TYP (id) DEFERRABLE INITIALLY DEFERRED; 

ALTER TABLE LE_TYP ADD CONSTRAINT 
    twowayref_rev FOREIGN KEY (id) REFERENCES LE (id) DEFERRABLE INITIALLY DEFERRED; 
+3

나에게 적절한 방법처럼 보입니다. –

+1

글쎄, 당신은 같은 테이블에 그 열을 넣을 수 있습니다 –

+2

순환 제약에 대한 필요성을 디자인 할 수 없다면 이미하고있는 일은 상당히 합리적입니다. –

답변

0

순환 제약이있는 곳에서 이상적인 작업을 수행하고 있습니다. 솔루션에서 개선 할 수있는 것은 없습니다.

다음 독자를 위해 간단히 언급 할 가치가있는 두 가지 점이 있습니다. 첫 번째는 코드에서이 솔루션을 사용하면 왜 주문을 선택했는지 분명하지 않다는 것입니다. 이 작업을 수행하는 경우 어떤 제약 조건이 지연되는지 조심해야합니다. 일반적으로 이것은 분명하지만 적절한 테이블을 참조하는 다른 외래 키를 기반으로 삽입 순서를 선택하려고합니다.

다른 하나는 원형 종속성을 처리하는 것이 바람직한지 여부입니다. 한편으로는 명백한 단순화처럼 보이게되면 좋은 생각처럼 보일 수 있습니다.

그러나 이와 같은 경우에는 여러 테이블 상속을 대신 살펴볼 필요가 있습니다. 이러한 방법으로 당신이 할 수 있습니다

CREATE TABLE p1 (
    id serial not null, 
    attribute1 int not null, 
    attribute2 text not null, 
    check (attribute1 > 1 or length(attribute2) > 10) 
); 

CREATE TABLE p2 (
    id int not null, -- shared primary key with p1 
    attribute3 int not null, 
    attribute4 text not null 
); 

CREATE TABLE combined (
    primary key (id) 
) INHERITS (p1, p2); 

이것은 하나 개의 테이블에있는 모든 컬럼을두고 있지만, 두 테이블은 공통 필드에 가입되어있는 경우 당신에게 해당 테이블에 논리적 인 인터페이스를 제공합니다.

관련 문제