다른 방법 (Null이없고 FOREIGN KEY
관계에 주기가없는 )은 "좋아하는 아이들"을 저장하는 세 번째 테이블을 만드는 것입니다. 대부분의 DBMS에서는에 대한 추가 UNIQUE
제약 조건 이 필요합니다 TableB
.
@Aaron은 위의 명명 규칙이 다소 번거롭고 오류가 발생할 수 있음을 식별하는 것이 더 빨랐습니다. Id
테이블 전체에 열 이없고 열 (결합 된 열)이 표시되는 많은 테이블에서 동일한 이름을 갖는 경우 일반적으로 더 좋습니다 . 여기 이름이 바뀌 었습니다.
Parent
ParentID INT NOT NULL PRIMARY KEY
Child
ChildID INT NOT NULL PRIMARY KEY
ParentID INT NOT NULL FOREIGN KEY REFERENCES Parent (ParentID)
UNIQUE (ParentID, ChildID)
FavoriteChild
ParentID INT NOT NULL PRIMARY KEY
ChildID INT NOT NULL
FOREIGN KEY (ParentID, ChildID)
REFERENCES Child (ParentID, ChildID)
사용중인 SQL-Server에는 IsFavorite
언급 한 비트 열 옵션도 있습니다 . 필터링 된 고유 인덱스를 통해 부모 당 고유 한 선호하는 자식을 달성 할 수 있습니다.
Parent
ParentID INT NOT NULL PRIMARY KEY
Child
ChildID INT NOT NULL PRIMARY KEY
ParentID INT NOT NULL FOREIGN KEY REFERENCES Parent (ParentID)
IsFavorite BIT NOT NULL
CREATE UNIQUE INDEX is_FavoriteChild
ON Child (ParentID)
WHERE IsFavorite = 1 ;
그리고 적어도 SQL-Server에서는 옵션 1이 권장되지 않는 주된 이유는 외래 키 참조의 순환 경로 패턴에 몇 가지 문제가 있기 때문입니다.
아주 오래된 기사 읽기 : SQL By Design : Circular Reference
두 테이블에서 행을 삽입하거나 삭제할 때 "chicken-and-egg"문제가 발생합니다. 제약 조건을 위반하지 않고 어떤 테이블을 먼저 삽입해야합니까?
이를 해결하려면 최소한 하나의 열을 nullable로 정의해야합니다. (OK, 기술적으로 당신은 당신이 모든 열을 가질 수 필요가 없습니다로 NOT NULL
하지만, 연기 제약을 구현 한 비슷한 질문에 어윈의 답변을 @ 참조하십시오 포스트 그레스 및 Oracle과 같은 DBMS,에 :. SQLAlchemy의 복잡한 외래 키 제약 조건 방법 이것은 Postgres에서 수행 할 수 있습니다). 그래도이 설정은 얇은 얼음 위에서 스케이트를 타는 느낌입니다.
SO에서 거의 동일한 질문도 확인하십시오 (그러나 MySQL의 경우) SQL에서 두 테이블이 서로 참조해도 괜찮습니까? 내 대답은 거의 같습니다. MySQL에는 부분 인덱스가 없으므로 nullable FK와 여분의 테이블 솔루션 만 실행할 수 있습니다.