2014-09-30 64 views
0

我有一個語言映射表,每個條目都有與幾個不同表的外鍵關係的可能性。 處理這種配置的最佳模式是什麼?與多個表之一之間的外鍵關係

表: LanguageMap,表A,表B

這是兩種可能性:

1.查找列方法 - 無外鍵約束:

Create Table LanguageMap (
    Id int not null primary key, 
    Language nvarchar not null, 
    Value nvarchar not null, 
    Type nvarchar not null, -- 'TableA', 'TableB', etc. 
    ForeignTableId int not null -- Is Foreign key to another table dependent on the type of the row. 
) 

2 。多個外鍵列

create Table LanguageMap(
    Id int not null primary key, 
    Language nvarchar not null, 
    Value nvarchar not null, 
    Type nvarchar not null, -- 'Activity', 'Verb', etc. 
    TableAId int null, 
    TableBId int null 
) 
alter table LanguageMap add constraint FK_LanguageMap_TableA 
foreign key (TableAId) references TableA (Id) 

alter table LanguageMap add constraint FK_LanguageMap_TableA 
foreign key (TableBId) references TableB (Id) 

alter table LanguageMap add constraint CK_LanguageMap_OneIsNotNull 
check (TableAId is not null or TableBId is not null) 
go 
alter table LanguageMap add constraint CK_LanguageMap_OneIsNull 
check (TableAId is null or TableBId is null) 
go 

外鍵約束基於Foreign Key for either-or column?

+0

您能否顯示一些樣本數據來闡明存儲在TableA和TableB中的內容?他們是否有相同的模式?此外,您是否只有2個不同的表格可以鏈接到這個問題,還是僅限於2個? – Tanner 2014-09-30 09:01:12

+0

我仍在編寫模式,所以我不確定會有多少個表。但假設模式會有根本的不同,並且至少有四個模式:即TableA,TableB,TableC,TableD。也許更多。爲什麼樣本數據是相關的? – Rafi 2014-09-30 09:20:52

+0

我試圖弄清楚表格中的模式/數據是否相似。 – Tanner 2014-09-30 09:31:35

回答

2

還有另外一種選擇,稱爲「共享主鍵」。你可以看看這個。如果TableA,TableB,TableC等全部「繼承」它們的PK作爲來自某個主表(例如稱爲「TableMaster」)的PK副本,那麼您可以在LanguageMap中將其用作FK。

正確的連接將選擇正確的實例。

共享主鍵通常與名爲「類表繼承」的設計模式結合使用。不知道TableA,TableB,TableC等是什麼,我不能說類表繼承是否與你的情況相關。

在任何情況下,請查看「共享主鍵」和「類表繼承」以供進一步閱讀。 這個地區有這些名稱的標籤。

+0

討論共享主鍵的一個很好的帖子:http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server – Rafi 2014-12-17 11:41:14