必要なすべてのボックスにチェックマークを付ける万能のソリューションはありません。しかし、私が以前に見たのは
3) 関係を共有する項目のベース テーブルを導入します。
CREATE TABLE Entities (
EntityID int not null primary key,
EntityType varchar(10) not null,
constraint CK_EntityTypes CHECK (EntityType in ('Person','Place')),
constraint UQ_Entities_WithTypes UNIQUE (EntityID,EntityType)
)
そして、People
テーブルPlaces
を構築します。
CREATE TABLE People (
PersonID int not null PRIMARY KEY,
EntityType AS CAST('Person' as varchar(10)) persisted,
...Other columns...
constraint FK_People_Entities FOREIGN KEY (PersonID,EntityType) references Entities (EntityID,EntityType)
)
CREATE TABLE Places (
PlaceID int not null PRIMARY KEY,
EntityType AS CAST('Place' as varchar(10)) persisted,
...Other columns...
constraint FK_Places_Entities FOREIGN KEY (PlaceID,EntityType) references Entities (EntityID,EntityType)
)
(Entities
場所について考えるとき、正確に正しいかどうかはわかりません-より良い名前があなたに提案されるかもしれません)。
をPictures
参照するだけで済みますEntityID
。
それ以外の場合、1 と 2 の間で選択する必要がある場合は、通常は 1 をお勧めします。関連する「型」の数が大きくならない限り、それでもPictures
テーブルが広くなりすぎることはありません。必要に応じて、少なくとも通常の FK メカニズムを使用してカスケードを強制します。
4)Pictures
現時点で非常にむき出しのテーブルである場合は、pictures テーブルが1 つ必要か、タイプごとに 1 つ必要かを問い合わせます。人物の写真と場所の写真が一緒にクエリされることがよくありますか (たとえそうであったとしても、UNION ALL
ベース クエリによって、別々のテーブルを使用しているという事実が隠される可能性があります)。