2012-09-18 169 views
2

目前,我們有這樣的設計用於存儲對象的多圖像/視頻網址:多個一對多的關係設計

tblCompany: 
pkCompanyId 

tblPerson: 
pkPersonId 

tblImage: 
pkImageId 
ImageUrl 
fkCompanyId 
fkPersonId 

雖然這種設計處理:

  1. 一個公司有多個圖像
  2. 有一個人多個圖像

我不禁感到有與tblImage中的行有關的這個設計有一個問題,那就是外鍵列有很多NULL值。

有更好的設計嗎?設計中的更多對象(有些與公司或個人無關,有些與公司或個人相關)將具有圖像,因此當前的設計tblImage可能擁有越來越多的外鍵。

+0

圖像總是會有一個公司和一個人,或只有一個或一個混合? – Mark

+0

圖像將始終有一個外鍵引用(一個或另一個)。爲了用圖像支持設計中的其他對象,我們會向圖像表添加一個新的外鍵 - 例如,如果有一個不相關的需要多個圖像的「House」對象,我們會將fkHouseId添加到tblImage。 –

回答

1

如果我正確理解架構,公司和人員無關,並且都可以有一個或多個圖像。然後,您可以爲圖片本身設置一個表格,爲公司圖片和人物圖片映射創建兩張不同的表格。

tblCompany: pkCompanyId 
tblPerson: pkPersonId  
tblImage: pkImageId ImageUrl  
tblPersonImage: fkImageId fkPersonId  
tblCompanyImage: fkImageId fkCompanyId 

該模式還使您可以將圖像與其他類型的實體(如產品)相關聯。

3

這實際上是一個很好的設計,只有2個實體可以有圖像。是的,你會有大量的空值,但替代方案(例如單獨的圖像表,或特製的1:N鏈接表)也會有問題。由於這是1:N關係,所以我們不需要任何額外的M:N結/鏈接表。


如果您需要添加多種,可以有圖片的實體,您可以考慮繼承,像這樣:

enter image description here

這樣,圖像就會自動能夠連接到任何從tblCommon繼承的實體,無論有多少種實體。不幸的是,關係數據庫管理系統不直接支持繼承,所以你必須在3 ways之一中模擬它,每一個都有自己的一套折衷。