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, BookAspectRating
tablonun 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 CHECK
kı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
VIEW
bir ilePRIMARY KEY
?Bir izin orada DBMS Are
FOREIGN KEY
oREFERENCES
birVIEW
(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.