2011-12-17 68 views
0

對於有經驗的數據庫開發人員,這可能是一個簡單的問題,但我很苦惱......我無法將某個ER圖翻譯爲數據庫模型, 。具有子類型交叉鏈接的超類型/子類型db設計

我有類似的設置滑動此呈現的17: http://www.cbe.wwu.edu/misclasses/mis421s04/presentations/supersubtype.ppt

幻燈片17示出了與具有員工類型屬性的僱員超型ER圖和作爲亞型僱員類型本身(每小時,工薪和顧問),這與我的設計情況非常相似。

就我而言,假設薪水員工是唯一可以成爲其他員工老闆的員工,並且我想以某種方式表明某個薪水員工是否是小時和/或薪水員工和/或顧問的老闆,沒有或兩者),這怎麼可能在數據庫模型中設計,同時考慮到這些是一對多的關係?

我可以把他們之間的PK-FK關係,這將導致有兩個FKeys和(就像FK_Employee和FK_SalariedEmployee顧問)和SalariedEmployee引用本身的所有表中,但我一直在想這也許不是最聰明的解決方案。 ...雖然我不確定爲什麼(誠信問題?)。

這是一個可接受的解決方案還是有更好的解決方案?

在此先感謝您的幫助!

回答

1

您的情況看起來像稱爲「泛化專業化」(簡稱Gen-Spec)的設計模式的實例。 gen-spec模式對於面向對象的程序員來說很熟悉。在教授關於繼承和子類的教程時將會介紹它。

實現gen-spec模式的SQL表的設計可能有點棘手。數據庫設計教程常常掩蓋了這個主題。但它在實踐中一次又一次地出現。

如果您在「泛化專業化關係建模」上搜索網頁,您會發現幾篇有用的文章,教您如何做到這一點。在這個論壇中,你也會被指出幾次這個話題。

這篇文章通常會向您展示如何設計一個表來捕獲所有通用數據和每個子類的一個專用表,這些表將包含特定於該子類的所有數據。有趣的部分涉及子類表的主鍵。您不會使用DBMS的自動編號功能來填充子類主鍵。相反,您將編寫應用程序以將通用表中獲得的主鍵值傳播到適當的子類表中。

這在廣義數據和專用數據之間建立了雙向關聯。每個專門的子類的簡單視圖將一起收集廣義和專門的數據。一旦你掌握了它,它很容易,它表現相當好。

在你的具體情況下,宣佈「FK的老闆」引用薪水員工表中的PK就足夠了。這會產生你想要的雙向聯繫,並且還可以防止那些沒有工資的僱員被引用爲老闆。

+0

非常感謝您的回答。我想我知道了,但要檢查一下:發電機組(發電機組)的PK id實際上與編程器的某個規格表的PK id是一樣的。因此,每個規格表(子類型)將始終具有與單個gen行相關的不同PK ID。這意味着'FK的老闆'也可以始終與髮型表(超類型)相關聯。我理解正確嗎? – TomL 2011-12-17 13:44:14

+0

呃...我的意思是當然有另外一種方式......規範表(例如Salaried Employee)的PK id實際上將以編程方式與其中一個gen table(Employee)的PK id相同, 對? – TomL 2011-12-17 14:01:46

+0

是的,還有更多。 「Boss of column」的FK值與Salaried Employees表中一行的PK值相同。反過來,這個PK將與Gene一行中的PK表的值相同。所以你可以根據這個共同的價值加入所有三張表。 – 2011-12-17 16:00:36