Terinspirasi oleh pertanyaan pemodelan Django: Pemodelan Basis Data dengan banyak hubungan banyak ke banyak di Django . Desain db adalah sesuatu seperti:
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)
) ;
dan masalahnya adalah bagaimana mendefinisikan BookAspectRating
tabel dan untuk menegakkan integritas referensial, jadi orang tidak dapat menambahkan peringkat untuk (Book, Aspect)
kombinasi yang tidak valid.
AFAIK, CHECK
kendala kompleks (atau ASSERTIONS
) yang melibatkan subqueries dan lebih dari satu tabel, yang mungkin bisa menyelesaikan ini, tidak tersedia di DBMS.
Gagasan lain adalah menggunakan (pseudocode) tampilan:
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) ;
dan tabel yang memiliki Kunci Asing untuk Tampilan di atas:
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)
) ;
Tiga pertanyaan:
Apakah ada DBMS yang memungkinkan (mungkin terwujud)
VIEW
dengan aPRIMARY KEY
?Apakah ada DBMS yang memungkinkan
FOREIGN KEY
bahwaREFERENCES
suatuVIEW
(dan tidak hanya basaTABLE
)?Bisakah masalah integritas ini diselesaikan sebaliknya - dengan fitur-fitur DBMS yang tersedia?
Klarifikasi:
Karena mungkin tidak ada solusi yang memuaskan 100% - dan pertanyaan Django bahkan bukan milikku! - Saya lebih tertarik pada strategi umum kemungkinan serangan terhadap masalah, bukan solusi terperinci. Jadi, jawaban seperti "dalam DBMS-X ini dapat dilakukan dengan pemicu pada tabel A" dapat diterima.