2008-12-22 170 views
31

當您需要將繼承類繼承到不支持繼承的關係數據庫時,有什麼技巧/技巧?數據庫繼承技術?

說我有這個經典的例子:

Person -> Employee -> Manager 
        -> Team lead 
        -> Developer 
     -> Customer -> PrivilegedCustomer 
        -> EnterpriseCustomer 

什麼是設計數據庫的可用技術?每個的優缺點?

p.s.我已經搜索並發現了關於數據庫繼承的幾個問題,但大部分都是關於更改爲原生支持它的數據庫引擎。但是,讓我們說,我堅持SQL Server 2005 ...我的選擇是什麼?

+0

相關問題:http://stackoverflow.com/questions/190296/how-do-you-effectively-model-inheritance-in-a-database – 2009-04-24 17:33:57

回答

27

常見的三種策略:

  1. 中包含每個類和外鍵回到頂級超類表中定義的屬性層次結構中每類創建一個表。所以你可能有一個vehicle表和其他表,如carairplanevehicle_id列。這裏的缺點是你可能需要執行很多連接才能獲得一個類的類型。

  2. 中包含的所有屬性的層次中的每個類創建一個表。這一點可能會變得棘手,因爲除非您使用類似於序列的東西,否則在所有表格中維護公共ID並不容易。對超類型的查詢需要針對所有有問題的表進行聯合。

  3. 爲整個類層次結構創建一個表。這消除了連接和聯合,但要求所有類屬性的所有列都放在一個表中。您可能需要將大多數列保留爲空,因爲某些列不適用於其他類型的記錄。例如,vehicle表可能包含一個名爲wingspan的列,該列對應於Airplane類型。如果將此列設置爲NOT NULL,則表中插入Car的任何實例都將需要wingspan的值,即使值NULL可能更有意義。如果您將列置空,您可能可以通過檢查約束來解決這個問題,但它可能會變得很難看。 (Single Table Inheritance

+0

查詢的複雜性是我關心的地方。它可能需要一些DAL部分的技巧才能正確使用。 – chakrit 2008-12-22 16:35:35

+2

對於查詢複雜性#3聽起來最好。此外,在某些DBMS(如Postgres)中,您可以通過檢查約束爲每個特定的子類型強制實現非空,即使這些列都是可以爲空的。 – 2011-06-15 13:45:09

6

在某些情況下要小心數據庫的繼承 - 我們在我們的審計策略應用程序中實現了它,最終導致了性能瓶頸/噩夢。

問題是我們使用的基表只是插入並且快速變化,所以我們最終以死鎖全部爲。我們目前正在計劃將這些分解成自己的表格,因爲在15個不同的表格中使用相同的列與表演噩夢相比,令人頭疼的事情非常值得。實體框架不一定能夠有效地處理繼承(這是微軟公司已知的一個問題),這一事實也加劇了這一點。

反正只是想我會分享一些知識,因爲我們已經通過在這個問題上擰乾。