Bir Django modelleme sorusundan esinlenildi: Django'da çoktan çoğa ilişkilerle Veri Tabanı Modellemesi . Db-design şöyle bir şey:
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)
) ;

ve mesele, BookAspectRatingtablonun nasıl tanımlanacağı ve referans bütünlüğünün güçlendirilmesidir, bu nedenle (Book, Aspect)geçersiz olan bir kombinasyon için derecelendirme eklenemez .
Alt sorguları içeren ve bunu çözebilecek birden fazla tablo içeren karmaşık CHECKkısıtlamalar (veya ASSERTIONS) AFAIK hiçbir DBMS'de mevcut değildir.
Başka bir fikir bir görünüm kullanmaktır (sözde kodu):
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) ;
ve yukarıdaki görünüme yabancı anahtar içeren bir tablo:
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)
) ;
Üç soru:
(Büyük olasılıkla hayata) izin orada DBMS misiniz
VIEWbir ilePRIMARY KEY?Bir izin orada DBMS Are
FOREIGN KEYoREFERENCESbirVIEW(ve sadece bir üsTABLE)?Bu bütünlük sorunu başka türlü çözülebilir mi - mevcut DBMS özellikleriyle?
Açıklama:
Muhtemelen% 100 tatmin edici bir çözüm olmadığı için - ve Django sorusu benim bile değil! - Ben daha ayrıntılı bir çözüm değil, soruna olası bir genel saldırı stratejisiyle daha fazla ilgileniyorum. Bu nedenle, "DBMS-X'te bu, A tablosundaki tetikleyicilerle yapılabilir" gibi bir cevap tamamen kabul edilebilir.