2008-12-02 93 views
2

你會如何在db中建立這些關係?關於數據庫建模的問題

您有一個可包含PageElements的Page實體。

PageElement可以是例如文章或圖片。文章表格明顯具有除圖片之外的其他成員/列。一篇文章可能有ie。 「Title」,「Lead」,「Body」列都是nvarchar類型,而圖片可能有類似「AltText」,「Path」,「Width」,「Height」的內容。我喜歡這是可擴展的,誰知道在3個月內我可能需要什麼PageElements?所以我想我需要一個PageElementTypes表。

對於關係,那這樣的表:

網頁一個ID,和其他魔神。 (創建日期,可見,什麼不該)

Pages_PageElements用的PageId和PageElementId。

PageElements帶有Id和PageElementTypeId以及更多的mumbojumbo(SortOrder,Visibility等)。

PageElementTypes用一個ID和一個名稱(如「條」,「圖片」,「AddressBlock」)

現在,我應該建立在每一個第一個PageElementId列,圖片,AddressBlocks表完成東西了嗎?這是我有點卡住,這是一個簡單的1:1關係,所以這應該工作,但不知何故,我可能會錯過一些東西。

追問:

下面設有獨立的屬性會強迫我的所有屬性存儲爲同一類型,或不推薦的解決方案?如果一個PageElement的屬性是nvarchar(255),而其中一些屬於nvarchar(1000),那麼如果某些是整數?

如果我得到了EAV的方式,我將不得不創建大量的表來保存所有不同數據類型的屬性值。

回答

0

通用的解決辦法是:

PageElementType: ID, Name, [Mumbo Jumbo] 
PageElementTypeParameter: ID, PageElementTypeID, [Mumbo Jumbo] 
Page: ID, [Mumbo Jumbo] 
PageElement: ID, PageElementTypeID, [Mumbo Jumbo] 
PageElementParameters: ID, PageElementID, PageElementTypeParameterID, Value, [Mumbo Jumbo] 

在人字:有一個頁面元素類型的表格,和相關聯的表,該表列出了每個頁面元素可能的參數(如SRC和ALT用於圖像;文章的文字等)。

然後是所有頁面的表格;一個列出每個頁面中的元素的關聯表;和一個列出每個元素參數值的表格。

+0

This Works。這基本上是實體屬性值(EAV)。它有優點和缺點。 – BobbyShaftoe 2008-12-02 09:26:28

+0

這不需要所有的參數都是相同的類型嗎? – kitsune 2008-12-02 09:36:13

+0

有辦法。首先,如果你使用MSSQL,使用nvarchar(MAX),否則檢查你的DBVS。其次,對於int/datetime/decimal /等,在同一個表中創建幾個列。對於每個記錄,只填寫一個。 – 2008-12-02 10:16:30

0

我用不同的命名約定,那麼你不過這基本上是我會做什麼:

PageElementType(PageElementTypeID,PageElementTypeName)

PageElement(PageElementID,PageElementTypeID)

條(條款ArticleID,PageElementID ,...)

圖片(PictureID,PageElementID,...)

頁(PAGEID,...)

PageHasPageElement(PageHasPageElementID,PAGEID,PageElementID)=> {PAGEID,PageElementID}是唯一

這是我做的,似乎是相當好標準化和表現良好。

1

就像您已配置頁面元素一樣,您需要配置與頁面元素關聯的屬性

因此,我們有兩個項目是可擴展的頁面元素&它們的屬性。

我sugges如下表:

:頁ID | ...

頁面元素:頁面元素ID |元素類型ID |頁面ID | ...

頁面元素類型:元素類型ID |頁面元素類型標籤

頁面元素屬性類型:屬性類型ID |元素類型ID |屬性標籤

頁面元素屬性:頁面元素ID |屬性類型ID |屬性值

頁面元素屬性類型表將包含與元素關聯的屬性列表。例如:

Atttibute Type ID 1 |文章| 「標題」

Atttibute類型ID 2 |文章| 「Lead」

Atttibute Type ID 3 |圖片| 「AltText」

頁面元素屬性表將存儲與頁面元素相關的屬性的實際值。例如:

頁面元素ID 1 |屬性類型ID 1 | 「人人都愛雷蒙德」

頁面元素ID 2 |屬性類型ID 3 | 「世界地圖」

2

兩種常見選擇是Single Table InheritanceMulti Table Inheritance。其他方法包括有我從未使用過的tables for each concrete class,以及我稱之爲元表實現,其中屬性定義被移入數據而不是任何類型的模式。

我對STI總體上有很好的經驗,並且假設您不期望過多的類和屬性,它是最簡單的解決方案。簡單在我的書裏非常好。

除非需要用戶在運行時創建新的頁面元素類型,否則我會避免使用meta-table方法和任何看起來像它的東西。根據我的經驗,與開發人員定期更新的更具體的實現相比,此類代碼很快就會變成一個泥潭,並且很少提供很多價值。

0

我想我會隨我得到的,EAV對我來說是沒有選擇的。我現在得到的是一種有點混合的方法。