2012-11-08 92 views
2

我有一個網站,我開發的結構有點像stackoverflow。我在數據庫中有一個Posts表和一個PostImages表。該PostImages表看起來像這樣:將表映射到許多其他表?

PostImageId PK 
PostId  FK 
Uri 
MimeType 

這樣的帖子可以有很多與之相關聯的圖像。

我現在有一個網站上的其他地方應該有圖片的要求:Users應該能夠在個人資料中有圖片,Categories應該能有圖像,Addresses應該能有圖片。

在我的數據庫中似乎最好只有一個Images表。我應該如何建模?我可以有一個表是這樣的:

ImageId PK 
PostId  FK 
CategoryId FK 
AddressId FK 
UserId  FK 
Uri 
MimeType 

我能有一個images表,然後額外的表爲每種對象:

PostImageId  PK FK 
PostId   FK 

CategoryImageId PK FK 
CategoryId  FK 

(每個項目的PK也FK來自Images表的圖像)

還有一些其他的策略:例如,我可以有一個___Images表爲每種類型,並沒有共享Images表。我可以爲每個映射表建立一個多對多的映射表,也許還有一些我沒有想到的其他解決方案。

什麼是最好的?我不太瞭解數據庫設計 - 這將是最靈活和最容易使用的?

+0

圖像是否可用於多個來源,如帖子和用戶?如果是這樣,可能最好的解決方案是添加一個額外的列到fk到圖像表的每個表(如果沒有圖像存在記錄,則爲null)。 – Emyl

+0

@Emyl一個帖子或一個用戶可以有多個圖像,所以把FK放在'Posts'或'Users'表中並不適用於我。 – Oliver

+0

對不起,沒有注意到這個要求。鑑於此,我個人認爲您應該爲每個對象選擇一個額外的表格。它會花費你額外的加入,但它更加靈活。作爲一個例子,每當需要一個新的對象時,它不需要ALTER TABLE。 – Emyl

回答

1

在現實生活中的項目中,數據庫是針對數據可訪問性的成本而設計的。你提到了兩種設計表格的方法。兩者都是正確的。如果將所有字段放在一個表中,則會有數據冗餘。如果你製作兩張桌子,沒有問題。

但是你必須記住,連接兩個表會花費更多。因此,從服務器獲取數據時,這可能會使頁面變慢(如果同時有很多用戶同時嘗試)。另一方面,如果將它放在一個字段中,它將佔用更多的數據庫內存,但數據獲取成本更低。這是你的選擇。

1

我去了第二選擇。我有一個Images表:

Images 
    ImageId PK 
    Name 
    Uri 
    Width 
    Height 
    MimeType 

和幾個映射表:

PostImages 
    PostImageId  PK FK 
    PostId   FK 

CategoryImages 
    CategoryImageId PK FK 
    CategoryId  FK 

我喜歡這個解決方案,我可以添加更多的映射表,而不改變Images表。維護起來更容易。另外,它允許Images表格更具語義性,因爲它只包含有關圖像的數據。

連接的成本不是一個大問題,因爲我只在任何查詢中返回少量圖像。但是,我沒有測試這兩種方法的相對速度。