墨色風(fēng)雨
2018-07-23 08:10:32
class="block_title"><a id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/linux254/archive/2008/11/20/1337836.html"></a><a id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/linux254/archive/2008/11/20/1337836.html"><span style="color: #800080;">數(shù)據(jù)庫設(shè)計難題的求教</span></a> </h1> <div class="post"> <div class="postcontent"> <p>最近在設(shè)計一個數(shù)據(jù)庫,但是碰到這樣一個難題,一直找不到合適的解決方案,希望有過類似經(jīng)驗的高手能夠幫忙分析下,看有沒有好的處理策略。</p> <p>舉個管道建設(shè)中的例子吧,同樣有三個對象:<br />管道:起點連接對象,結(jié)束點連接對象,管道的其他屬性信息<br />管件:管件名稱、管件類型<br />設(shè)備:設(shè)備名稱、設(shè)備編號、設(shè)備所屬單位<br /><br />關(guān)系是:管道的起點和終點連接管件或者設(shè)備,而設(shè)備和管件沒有多少屬性是相同的,所以不能合并,這時候表的關(guān)系應(yīng)該如何建?<br /><br />目前的一種考慮是使用軟關(guān)聯(lián),就是在管道的表里用4個字段,分別是起點對象類型和起點對象ID,終點連接類型和終點連接ID,但是數(shù)據(jù)庫建模時這種關(guān)系無法用實體關(guān)系圖合理的展示,也無法在數(shù)據(jù)庫中用外鍵關(guān)系來描述,無法保證數(shù)據(jù)的完整性,所以感覺不是很好的解決方案,想知道大家有沒有更好的思路。:)
2 回答

森林海
TA貢獻(xiàn)2011條經(jīng)驗 獲得超2個贊
其實不必追求實體關(guān)系圖的合理,也未必非要用外鍵,雖然可以沒有約束,但是依然可以由程序來很好的管理這些
不過非要追求這個的話,我以前倒是做過一個,效果也還可以,可以參考一下:
管道表里包括:起點連接管件ID、起點連接設(shè)備ID、終點連接管理ID、終點連接設(shè)備ID、其他屬性信息
前面四個ID都是外鍵,管件ID和設(shè)備ID分別關(guān)聯(lián)到各自的表,四個都設(shè)置為可空,這樣在程序中或者select時判斷一下到底取哪個,但依然存在的問題是必須由程序來保證起點和終點都各自只有一個ID,另一個要為NULL。
另外一個辦法,可以避免這個很麻煩的判斷,但是其他地方要麻煩一些,還是這些字段,增加一個起點連接類型和終點連接類型,select的時候在inner join中除了ID關(guān)聯(lián)之外,增加對連接類型的條件,另外也可以使用union all來進(jìn)行查詢

幕布斯7119047
TA貢獻(xiàn)1794條經(jīng)驗 獲得超8個贊
添加一個中間表,有4個字段:
管道ID、
起點或中點【管道的起點還是終點】、
連接對象類型【管道的起點或終點是設(shè)備還是管件】、
連接對象ID【管件或設(shè)備的ID】
添加回答
舉報
0/150
提交
取消