2009-02-09 124 views
13

我目前正在查看重組聯繫人管理數據庫的過程,我想聽取人們對解決具有共享屬性的多種聯繫類型問題的意見。SQL Server中的表「繼承」

基本上我們有6種聯繫方式,其中包括Person,Company和Position @ Company。

在當前的結構中,所有這些都有一個地址,但是在地址表中您必須存儲它們的類型才能加入聯繫人。

加入聯繫人類型的這種一致要求會在一段時間後變得令人沮喪。

今天我碰到一個帖子在討論「表繼承」(http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server)跌跌撞撞。

基本上你有一個父表和一些子表(在這種情況下是每個聯繫類型)。從那裏你強制執行完整性,以便子表必須具有與其類型相同的主定義。

我看到它的方式,通過這種方法我將不再需要存儲的類型,如地址表中,作爲ID是在所有類型的獨特。

我只是想知道是否有人對這種方法的任何感情,無論是一個很好的路要走,或者替代品?

我使用的是SQL Server的05 & 08應該使任何區別。

感謝

埃德

回答

1

你仍然有問題,如果你想要的子類型字段,你有隻有主接觸,你必須知道去什麼表看 - 或加入他們所有的人。但除此之外,這是解決常見問題的可行解決方案。

另一種可能性(在結構上非常相似,但你怎麼想起來不同)是簡單地把所有的聯繫人導入到一個表。然後,對於更具體的字段(birthday表示爲人員,department爲位置@公司)創建與該聯繫人相關聯的單獨表格。

 
    Contact Table 
    -------------- 
    Name 
    Phone Number 

    Address Table 
    ------------- 
    Street/state, etc 
    ContactId 

    ContactBirthday Table 
    -------------- 
    Birthday 
    ContactId 

    Departments Table 
    ----------------- 
    Department 
    ContactId 

它需要的東西不同的思維方式,但 - 而不是人與企業的思維,你覺得手頭的任務的各種功能要求 - 如果你想發送生日賀卡,得到所有具有與它們相關聯的生日等的聯繫..

1

我知道這不會幫助太多,但是最初它可能是最好有一個實體表,而不是6種不同的聯繫類型。然後每個實體可以根據需要具有儘可能多的地址,並且不需要在連接中輸入類型。

1

我打算在這裏出去走走,建議你應該重新考慮你的規範化策略(因爲你似乎很幸運能夠從根本上重新思考你的模式)。如果您通常爲每個聯繫人存儲地址,則您的聯繫人表格中應包含地址字段。或者,如果該地址是按公司存儲的,則地址應存儲在公司表格中,並將您的聯繫人鏈接到該公司。

如果您的聯繫人只有一個地址,或者其他字段的一個(甚至是3個,而不是'很多')實例,請考慮將它們合理化爲一個表。根據我的經驗,有幾個空字段是一個好得多的選擇,而不需要左連接來存儲您不確定的數據。

幸運的是,對於任何強烈不同意我的人,你確實要求意見! :)恕我直言,你應該正常化,當你真的需要。在你重新思考模式的地方,應該在每個機會中考慮非規範化。

+0

我明白你在說什麼,但是對每種類型存儲地址或聯繫人數據(手機)是不可能的,因爲很可能我會針對每種類型有多個地址/數據。這也可能是我想分享多個聯繫人之間的地址,想象一個家庭。 – MrEdmundo 2009-02-09 19:33:15

+0

酷,一個公平的電話,所以我建議去尋找一組平面的聯繫人/地址等,在不同的表中沒有特定的類型,只要在任何一個表中定義它的類型是有意義的。再次說明,除非真的需要複雜(例如,海量和易變的數據集)。 – Timbo 2009-02-09 23:35:53

1

當你有第七種類型時,你將不得不創建另一個表。

6

我設計了一個數據庫,就像你提供的鏈接一樣。案例是存儲許多不同技術報告的數據。報告類型的數量是未定義的,可能會增長到約40種不同的類型。

我創建了一個主自動增量主鍵的主表報表。該表包含客戶,工地,設備,日期等所有常見信息。

然後,我爲每種報告類型都有一個表格,其中包含與該報告類型有關的特定信息。該表與主服務器具有相同的主鍵,並引用主服務器。

我的想法是用1:1的關係將它分解成不同的表格(這通常是一個不允許的),這樣做的目的是爲了避免讓一個表格擁有大量的列,這樣就很難保持你的狀態不斷添加列。

我的表設計與表繼承給了我分段的數據和可擴展性,而不是難以維護。我唯一需要做的就是寫一個特殊的保存方法來自動處理寫入兩個表。到目前爲止,我對設計非常滿意,並沒有真正發現任何缺點,除了一些更復雜的保存方法。

2

谷歌關於「gen-spec關係建模」。你會發現很多文章討論這種模式。其中一些專注於桌面設計,而其他則專注於面向對象的方法。

表中繼承彈出其中幾個。

1

我要試試這種方法。是的,當你有一個新的類型時你必須創建新的表格,但是由於這個表格可能有不同的列,所以如果你不使用這個方案,你最終會這樣做。

如果繼承主的表沒有多少區別,我建議您嘗試另一種方法。

1

我可以建議我們只添加一個Type表。即一個人有一個地址,名稱等,然後學生,老師作爲每個用例呈現其自己我們有一個人類表,有一個從人表入口n型和隨後的新表老師,外星人,歌手作爲系統相關...