2011-12-08 132 views
1

我有一張名爲people的表,另一個名爲people_attributes表設計,有很多屬性?

在我的網站上,人們提交各種屬性,如藍色的眼睛,棕色的頭髮,瘦,我需要返回所有獨特的人與屬性。

我掙扎着我的桌子設計。 people表中的一個人可以有許多屬性。我應該如何將每個人的屬性保存在人員表中?

或者我應該使用屬性類型和擁有它的人員的ID來創建單獨的表格?

但是,有了這個想法,一個屬性可以有很多人,我怎麼能存儲一個屬性與許多人附加到它,但仍然只能得到獨特的人?逗號分隔的列表?但是,我將如何搜索?我怎樣才能回報獨特的人? I.E如果我正在尋找藍色的眼睛和棕色的頭髮,那麼類別的藍色眼睛會有人1,棕色的頭髮也會有。所以查詢會返回兩個人1。

回答

4

People(id, name, etc.), Attributes(id, description), People_Attribute(people_id, attribute_id)怎麼樣?

+0

將不以人的屬性表中有大量的重複數據?所以如果人1有屬性,高大的,灰白的頭髮,藍色的眼睛,戴眼鏡...不會是4排?或者你能夠把所有的屬性放在一行中? – beans

+0

是的,他們會有4排......每一個對於那個人來說都是獨一無二的。如果你把所有的數據都放在一行中,你將如何搜索所有頭髮灰白,戴眼鏡並且身材高大的人? – xQbert

0

您可以創建樹表:

  1. ATTRIBUTE_LIST
  2. Peple_attribute

,你可以在這些表像搜索:

select ... from people inner join Peple_attribute on ... inner join Attribute_list on ... Where Peple_attribute.value='...' and Attribute_list.name='...' 
0

有很多如何實現這個,這真的取決於你的需求。

最簡單的方式

如果你知道的,事先,該屬性的數量不會大幅增加,並且每個屬性都將有幾個值,你可以只讓他們在同一張桌子。

Table People: 
ID 
Name 
Eye_color 
Weight 
.... 

優點 - 報告速度快,易於維護。易於理解的查詢 缺點 - 不靈活。很難添加新列,列數可能會失控。

獨立屬性表

在這種情況下,你將有一個單獨的屬性表,每人/屬性值一行。然後

Table People: 
ID 
Name 

Table Attributes 
ID 
Name 

Table Attributes_people 
ID 
People_ID 
Attributes_id 
Value 

的查詢可能看起來像:

select * from people where id in (
    select people_id from attributes_people where value='blue' and attributes_id = 'eye color' 
    intersect 
    select people_id from attributes_people where value='brown' and attributes_id = 'hair color') 

這會給你所有誰了藍眼睛,棕色的髮色

利益的人的名單:無限擴展,無限每個人的屬性數量。缺點:查詢變得更加複雜。

對象DB

你也可以尋找到一個面向對象的數據庫,如MongoDB的或CouchDB的人作爲儲存儘可能多的屬性的對象,只要你願意。

優點:非常靈活 缺點:不是SQL