2013-09-30 105 views
2

我有一些表具有不同的結構,但包含相同的數據(在本例中它是名字和姓氏)。多態樣SQL數據庫表結構

enter image description here

編輯:演示結構小提琴 - http://sqlfiddle.com/#!2/cce568

但是現在我需要創建一些集體表將存儲該信息+一些細節(如日期時間,公司名稱,位置等) 。根據剩餘字段的上下文,該集合表可以包含多個實體。

有一些模式是如何保存這種集體桌子,好嗎?根據Bill Carwin的文章(https://stackoverflow.com/a/562030/1092627),我可以將所有這些表格合併爲一個表格,但如果需要將一些信息直接添加到此表格中,我該怎麼辦?

在此先感謝您的意見。

+2

最原始的方式發佈結構我見過。請使用小提琴取樣。 –

+0

比爾的答案確實與多態性有關,但你沒有。不過,我可能錯誤地理解了它。請詳細說明。 – Sebas

+0

謝謝,可能我是錯誤理解某人的人。我想要做的就是從一張表中引用可以以多種方式存儲的信息(在不同的表中),並試圖找到如何定義集合表結構的正確方法。 – JCZ

回答

7

Craig Larman與書「應用UML與模式」介紹了3把共同解決這個問題。

你的例子不是特別有幫助 - 有沒有合乎邏輯的理由有3種不同的數據庫管理人員的姓名的方式(雖然這並不經常因爲數據導入/導出古怪的發生)。

然而,有一個「人」實體可能是僱員(包括employee_id),聯繫人(帶有到潛在客戶表的鏈接)或客戶(帶有customer_id和鏈接到訂單表)。

在Larman與的書,他給3個解決方案。

一張表來統治他們全部 在這裏,您創建一個包含所有已知列的單個表。這創建了一張亂七八糟的表格,並且推動了將每個子類持久化到應用程序層的規則的責任 - 數據庫不會強制客戶擁有customer_id。但是,它使連接變得更加簡單 - 任何需要鏈接到人員的表格都可以鏈接到人員表格。

超類表 這通過將通用屬性提取到單個表中來清理事情 - 例如, 「person」 - 並將子類特定的字段推送到子類表中。因此,您可能將「person」作爲超類表,並將「contact」,「employee」和「customer」表與特定的子類數據關聯起來。子類表有一個「person_id」列以鏈接回超類表。這更復雜 - 通常在檢索數據時需要額外的連接 - 但也不太容易出錯 - 您不會意外地使用爲「員工」寫入無效屬性的錯誤來破壞數據模型。每個子類

表 - 這是你所描述的東西。它將相當數量的重複引入數據模型,並且您經常有條件連接 - 「如果person type = y,則連接到表x」,這可能會使數據訪問代碼變得棘手。