2011-08-03 50 views
1

夥計我目前有2個引用查找表的表。我一直負責修改數據庫以允許表引用查找表中的多個值。重構sql模式

我的想法是創建一個具有新PK和引用查找表的列的新表。那麼新表的PK被傾倒入父表從而保持參照完整性E.G

當前

Contracts 
========= 
PK Id 
FK lookupId 

Warranties 
========== 
PK Id 
FK lookupId 

Contracts 
========= 
PK Id 
FK LinkingTableId 

Warranties 
========== 
PK Id 
FK LinkingTableId 

LinkingTable 
============ 
PK Id 
FK LookupId 

這是處理多重引用的好辦法?

+0

那麼你現在有查找表的查找表?它看起來不錯,但不知道查找表是否可以完全解釋。 – Jacob

+0

@cularis查找表是一個學科列表。而已。我的公司現在希望用戶能夠選擇多個學科而不僅僅是一個,是的,我想這將是另一個查找表的查找表。有什麼想法嗎? –

+1

好吧,那就是標準。要將一對一關係更改爲一對多,您需要類似鏈接表的內容,以便您的解決方案可以正常工作。 – Jacob

回答

2

新提出的表結構無法處理多個引用,因爲每個合同和擔保行鏈接到只有一個單一的LinkingTable一行。

我看到兩種方法可以做到這一點:

  1. 添加兩個不同的鏈接表,每個許多一對多的關係:

    Contracts 
    ========= 
    PK Id 
    Other_Contract_Stuff 
    
    ContractLinkingTable 
    ==================== 
    PK ContractId, LookupId 
    FK ContractId 
    FK LookupId 
    
    Warranties 
    ========== 
    PK Id 
    Other_Warranty_Stuff 
    
    WarrantyLinkingTable 
    ==================== 
    PK WarrantyId, LookupId 
    FK WarrantyId 
    FK LookupId 
    
  2. 添加一個新的鏈接表,以處理多對多關係:

    Contracts 
    ========= 
    PK Id 
    Other_Contract_Stuff 
    
    Warranties 
    ========== 
    PK Id 
    Other_Warranty_Stuff 
    
    LinkingTable 
    ==================== 
    PK LinkedType, LinkedId, LookupId 
        LinkedType ("C" for Contract, "W" for Warranty) 
        LinkedId (either a ContractId or a WarrantyId) 
    FK LookupId 
    

第一個是正確的和可取的解決方案,因爲引擎可以強制執行表外鍵和數據完整性的風險較小。我看到後者在一些真實世界的項目中使用。它有效,但它不是一個好的解決方案......遲早你會遇到問題。

+0

是的你的權利。回顧我的解決方案,現在顯而易見。感謝您指出了這一點。在你的第一個解決方案中,你是否說我需要連接表中的四列?我如何設置lookupid和warrantyId都是主鍵 –

+0

您只需要2列,但您可以並應該定義3個約束:1 PK和2 FK。 'ALTER TABLE Con​​tractLinkingTable ADD CONSTRAINT pk_ContractLinkingTable PRIMARY(ContractId,LookupId)' – Frazz

1

您建議的方法是標準方法。鏈接表被稱爲「Junction」表。 http://en.wikipedia.org/wiki/Junction_table

我會建議對您的命名約定進行更改。此外,您的主數據表不再需要FK,並且聯結表不需要它自己的主鍵,而是兩個外鍵上的複合鍵。

Contracts 
========= 
PK Id 
Other_Stuff 

Warranties 
========== 
PK Id 
Other_Stuff 

Contract_Warranties 
============ 
FK ContactId 
FK WarrantyId 
+0

鏈接表或聯結表仍應具有主鍵。也許你的意思是說它不需要代理單列鍵? –

+0

@Tom H.謝謝。回答相應修改。 –