Opcja 2 to nie dobre rozwiązanie dla relacyjnej bazy danych. To się nazywa polimorficzne stowarzyszenia (jak wspomniał @ Daniel Vassallo) i łamie podstawową definicję relacji.
Załóżmy na przykład, że masz ResourceId z 1234 na dwóch różnych wierszach. Czy reprezentują one ten sam zasób? Zależy to od tego, czy CommentTypeId jest taki sam w tych dwóch wierszach. Narusza to koncepcję typu typu w relacji. Zobacz SQL and Relational Theory autorstwa C. J. Data, aby uzyskać więcej informacji.
Inną wskazówką, że jest to zepsuty projekt, to że nie można zadeklarować ograniczenia klucza obcego dla ResourceId, ponieważ może to wskazywać na jedną z kilku tabel.Jeśli próbujesz wymusić integralność referencyjną za pomocą wyzwalaczy lub czegoś podobnego, możesz przepisać wyzwalacz za każdym razem, gdy dodasz nowy typ zasobu z możliwością komentowania.
chciałbym rozwiązać ten problem z rozwiązaniem, które @mdma krótko wspomina (ale wtedy ignoruje):
CREATE TABLE Commentable (
ResourceId INT NOT NULL IDENTITY,
ResourceType INT NOT NULL,
PRIMARY KEY (ResourceId, ResourceType)
);
CREATE TABLE Documents (
ResourceId INT NOT NULL,
ResourceType INT NOT NULL CHECK (ResourceType = 1),
FOREIGN KEY (ResourceId, ResourceType) REFERENCES Commentable
);
CREATE TABLE Projects (
ResourceId INT NOT NULL,
ResourceType INT NOT NULL CHECK (ResourceType = 2),
FOREIGN KEY (ResourceId, ResourceType) REFERENCES Commentable
);
Teraz każdy typ zasobu ma swój własny stolik, ale seryjny klucz podstawowy jest alokowana jednoznacznie przez Commentable. Dana wartość klucza podstawowego może być używana tylko przez jeden typ zasobu.
CREATE TABLE Comments (
CommentId INT IDENTITY PRIMARY KEY,
ResourceId INT NOT NULL,
ResourceType INT NOT NULL,
FOREIGN KEY (ResourceId, ResourceType) REFERENCES Commentable
);
Odsyłacze do uwag Zweryfikowane zasoby, z wprowadzoną integralnością referencyjną. Dany komentarz może odnosić się tylko do jednego typu zasobu. Nie ma możliwości wystąpienia anomalii lub sprzecznych identyfikatorów zasobów.
Omówię więcej o stowarzyszeniach polimorficznych w mojej prezentacji Practical Object-Oriented Models in SQL i mojej książce SQL Antipatterns.
Czy można skomentować jeden komentarz dla więcej niż jednego przedmiotu? Na przykład dokument i projekt lub dwa dokumenty? –
Żaden komentarz nie może dotyczyć tylko jednego przedmiotu. – Gazeth