Django 모델링 질문에서 영감을 얻었습니다. Django의 여러 다 대다 관계를 가진 데이터베이스 모델링 . db-design은 다음과 같습니다.
CREATE TABLE Book
( BookID INT NOT NULL
, BookTitle VARCHAR(200) NOT NULL
, PRIMARY KEY (BookID)
) ;
CREATE TABLE Tag
( TagID INT NOT NULL
, TagName VARCHAR(50) NOT NULL
, PRIMARY KEY (TagID)
) ;
CREATE TABLE BookTag
( BookID INT NOT NULL
, TagID INT NOT NULL
, PRIMARY KEY (BookID, TagID)
, FOREIGN KEY (BookID) REFERENCES Book (BookID)
, FOREIGN KEY (TagID) REFERENCES Tag (TagID)
) ;
CREATE TABLE Aspect
( AspectID INT NOT NULL
, AspectName VARCHAR(50) NOT NULL
, PRIMARY KEY (AspectID)
) ;
CREATE TABLE TagAspect
( TagID INT NOT NULL
, AspectID INT NOT NULL
, PRIMARY KEY (TagID, AspectID)
, FOREIGN KEY (TagID) REFERENCES Tag (TagID)
, FOREIGN KEY (AspectID) REFERENCES Aspect (AspectID)
) ;
문제는 BookAspectRating
테이블 을 정의하고 참조 무결성을 강화 (Book, Aspect)
하는 방법이므로 유효하지 않은 조합에 등급을 추가 할 수 없습니다 .
서브 쿼리와이를 해결할 수있는 둘 이상의 테이블을 포함하는 복잡한 CHECK
제한 조건 (또는 ASSERTIONS
) 인 AFAIK 는 DBMS에서 사용할 수 없습니다.
또 다른 아이디어는 뷰를 사용 (의사 코드)하는 것입니다.
CREATE VIEW BookAspect_view
AS
SELECT DISTINCT
bt.BookId
, ta.AspectId
FROM
BookTag AS bt
JOIN
Tag AS t ON t.TagID = bt.TagID
JOIN
TagAspect AS ta ON ta.TagID = bt.TagID
WITH PRIMARY KEY (BookId, AspectId) ;
위의보기에 대한 외래 키가있는 테이블 :
CREATE TABLE BookAspectRating
( BookID INT NOT NULL
, AspectID INT NOT NULL
, PersonID INT NOT NULL
, Rating INT NOT NULL
, PRIMARY KEY (BookID, AspectID, PersonID)
, FOREIGN KEY (PersonID) REFERENCES Person (PersonID)
, FOREIGN KEY (BookID, AspectID)
REFERENCES BookAspect_view (BookID, AspectID)
) ;
세 가지 질문 :
A는 (아마도 구체화) 할 수있다 DBMS 있습니까
VIEW
A의는PRIMARY KEY
?을 할 수있다 DBMS 있습니까
FOREIGN KEY
그 (및뿐만 아니라 기본 )은?REFERENCES
VIEW
TABLE
사용 가능한 DBMS 기능으로이 무결성 문제를 다른 방식으로 해결할 수 있습니까?
설명:
아마도 100 % 만족스러운 해결책이 없기 때문에 장고 질문은 내 것이 아닙니다! -자세한 해결책이 아니라 문제에 대한 일반적인 공격 전략에 더 관심이 있습니다. 따라서 "DBMS-X에서이 작업은 테이블 A의 트리거로 수행 할 수 있습니다" 와 같은 대답 은 완벽하게 허용됩니다.