2010-08-03 66 views
0

我有一個表具有一個軟外鍵,根據表中的另一個值將表中的記錄鏈接到許多其他表之一。爲了證明:SQL設計建議:一個FK列,許多表引用

TableOfTables:ID,表名

HistoryTable:身份證,TableOfTableId,NumberedTableId等..

表1:身份證,等等

表2:ID等..

表3:身份證,等等

TableOfTables包含在數據庫中(表1,表2,表3,...),每個編號的表中的記錄。 HistoryTable具有該表的外鍵(TableOfTableId)。它還有一個NumberedTableId列,它是對編號表的Id列的引用。

現在,這工作得很好,但NumberedTableId和編號表的Id列之間沒有參照完整性。現在據我所知,你不能創建一種有條件的外鍵,它可以根據某些條件指向不同的表......那麼在這裏獲得引用完整性的最好方法是什麼?

我能想到的唯一兩件事情是在HistoryTable中有大量可爲空的NumberedTableId列,每個列都有一個外鍵給特定的編號表,其餘的列填充爲空......醜陋的,或者爲每個編號的表有一個單獨的HistoryTable ...這將意味着很多HistoryTables,因爲我們的數據庫中有許多編號表。

這裏我最好的選擇是什麼?歷史記錄表實際上是一個記錄表,它記錄了編號表中的變化以及誰更改了值,它不用於審計之外的任何其他用途,也不用於我們的程序讀取,但我不喜歡沒有完整的參照完整性。

我在這裏有什麼選擇?任何解決方案都需要能夠使用Entity Framework 4.0。

感謝

+0

唯一干淨的答案是:重新構建您的解決方案。使用一個表引用多個其他表的方法是一種巨大的SQL代碼異味....清理它! – 2010-08-03 05:03:07

回答

1

其實,有三個選項(你提到的兩個,但我會在這裏重申他們)

  1. 多FK列有一個檢查約束來強制執行給定行只能有一個FK值。
  2. 多個歷史記錄表
  3. 單個歷史記錄表,包含來自地獄的觸發器以強制引用完整性(源表和歷史記錄表上的觸發器)。

有沒有乾淨的答案。我對這個問題的解決方法是使用外鍵和級聯更新和刪除爲每個當前數據表提供歷史記錄表。這至少可以避免單個表格上的瓶頸,允許參照完整性,並且對其他開發人員來說很明顯。