是否需要單個表的原因是,您希望確保當六個父表引用保證爲相同實例的子行的給定實例?這是經典的「多親」問題。您可能遇到的一個例子是地址或電話號碼與多個人/聯繫人表。
我能想到幾個選項:
選擇1:每個父表的鏈接表。這將是Hoyle架構。所以,像這樣:
Create Table MyTable(
id int not null Primary Key Clustered
, info1 varchar(50) null
, info2 varchar(50) null
, info3 varchar(50) null
)
Create Table LinkTable1(
MyTableId int not null
, ParentTable1Id int not null
, Constraint PK_LinkTable1 Primary Key Clustered(MyTableId, ParentTable1Id)
, Constraint FK_LinkTable1_ParentTable1
Foreign Key (MyTableId)
References MyTable (Id)
, Constraint FK_LinkTable1_ParentTable1
Foreign Key (ParentTable1Id)
References ParentTable1 (Id)
)
...
Create Table LinkTable2...LinkTable3
選擇2.如果你知道,你永遠不會有超過說的六個表,並願意接受一些非規範化和設計的fugly,你可以增加6個外鍵的主表。這樣可以避免填充一堆鏈接表的問題,並確保正確的引用完整性。但是,如果父母的數量增加,那麼這種設計可能會很快失去控制。
如果您滿足於您現有的設計,那麼就字段大小而言,我會使用完整的表名稱。坦率地說,char(3)和varchar(50)甚至varchar(128)之間的性能差異對於您可能放入表中的數據量而言可以忽略不計。如果你真的認爲你將擁有數百萬行,那麼我會強烈考慮鏈接表的選項。
如果您想保持您的設計並希望獲得最佳性能,那麼我將使用帶有外鍵的tinyint指向包含帶tinyint主鍵的六個表的列表的表。這可以防止數字變得「魔術」,並確保您縮小父表的列表。當然,它仍然不能防止孤立的記錄。在這個設計中,你必須使用觸發器來做到這一點。
表定義的第一行是什麼意思? ** int id int FK_id varchar(50)** – 2010-02-18 19:30:20
因此,FK值可以是6個其他表中的1個PK? – 2010-02-18 19:31:39
@KM這意味着編輯找到了我。現在修復它。 @iKnowKungFoo正確。這是因爲它在每個表中都是相同的信息,但我需要能夠訪問它的任何一個,而不必將6個表中的每個表聯合起來。 – corymathews 2010-02-18 19:33:13