2009-02-05 50 views
1

假設您要創建窗口小部件列表如何最好地表示數據庫中具有變量屬性的項目?

窗口小部件製造商都創建具有不同數量和類型屬性的窗口小部件。而Widget賣家對於他們想要存儲在數據庫和顯示器中的屬性類型和數量都有不同的偏好。

現在的問題是,每次添加一個新窗口小部件時,它可能具有其他任何其他窗口小部件當前不存在的屬性,目前您通過修改表格並添加新列該屬性,然後修改所有表單和報告以反映此更改。

你如何着手創建一個數據庫,該數據庫考慮到一個小部件上的屬性是流暢的,並且可以從小部件更改爲小部件。

理想情況下,小部件的屬性應該是用戶可以根據他/她的喜好來定義,需要

回答

3

我會對部件一張桌子和一個用於控件的屬性。例如:

Widgets 
    - Id 
    - Name 

WidgetAttributes 
    - Id 
    - Name 

然後,你會擁有什麼部件有哪些屬性另一個表:

WidgetAttributeMap 
    - Id 
    - WidgetId 
     (a value from the Id column in the Widget table) 
    - WidgetAttributeId 
     (a value from the Id column in the WidgetAttribute table) 

這樣,您就可以通過在WidgetAttributeMap修改表中的行屬性添加到窗口小部件,不通過修改widget表的結構。

+0

進行比較會在此情況下,會導致性能問題大量的小部件? 如果要顯示1000個小部件,那麼對於每個小部件,我們都必須單獨查詢它們的屬性。 我不是數據庫專家,所以不知道這是否會在一次SQL查詢中顯着減慢速度? – 2009-02-05 01:10:23

2

casperOne的顯示方式,但我會親自加還多了一個表的屬性值,與

Widgets 
    -WidgetID (pk) 
    -Name 

WidgetAttributes 
    -AttributeID (pk) 
    -Name 

WidgetHasAttribute 
    -WidgetID (pk) 
    -AttributeID (pk) 

WidgetAttributeValues 
    -ValueID (pk) 
    -WidgetID 
    -AttributeID 
    -Value 

結束了爲了檢索的結果,你想加入的表和執行總串聯,這樣你就可以用數據最終看起來像(例如):

Name  Properties 
Widget1 Attr1:Value1;Attr2:Value2;...etc 

然後,你可以在你的業務邏輯層拆分屬性字符串,並根據需要使用。

如何加入數據反映:

SELECT w.Name, wa.Name + ':' + wav.Value 
FROM ((
    Widgets w 
    INNER JOIN 
    WidgetHasAttribute wha 
    ON w.WidgetID = wha.WidgetID) 
    INNER JOIN WidgetAttributes wa 
    ON wha.AttributeID = wa.AttributeID) 
    INNER JOIN WidgetAttributeValues wav 
    ON (w.WidgetID = wav.WidgetID AND wa.AttributeID = wav.AttributeID) 

你可以閱讀更多的總級聯here

就性能而言,它不應該是一個問題,只要你一定要索引的所有列,這將是頻繁讀取 - 這是

  • 所有的ID列,因爲他們將在加盟條款
  • WidgetAttributes.Name和WidgetAttributeValues.Value,因爲他們將串聯
相關問題