表设计,有很多属性?

时间:2011-12-08 17:29:32

标签: sql

我有一个名为people的表,另一个名为people_attributes

在我的网站上,人们提交了各种属性,比如蓝眼睛,棕色头发,瘦身,我需要返回所有具有属性的独特人物。

我正在努力摆弄桌面设计。 people表中的一个人可以拥有许多属性。我应该如何在人员表中保存每个人的属性?

或者我应该创建一个单独的表格,其中包含属性类型和拥有它的人的ID?

但是有了这个想法,一个属性可以有很多人,我怎样才能存储一个附加了许多人的属性,但仍然只能找到独特的人?逗号分隔列表?但是我该怎么搜索呢?我怎样才能归还独特的人? I.E如果我正在寻找蓝色的眼睛和棕色的头发,那么蓝色的眼睛会有人1,棕色的头发也是如此。因此查询将返回两个人1。

3 个答案:

答案 0 :(得分:4)

People(id, name, etc.), Attributes(id, description), People_Attribute(people_id, attribute_id)怎么样?

答案 1 :(得分:0)

您可以创建树表:

  1. ATTRIBUTE_LIST
  2. Peple_attribute
  3. 您可以在以下表格中搜索:

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

答案 2 :(得分: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')

这会给你一份蓝眼睛和棕色头发的所有人的清单

优点:每个人无限可扩展,无限数量的属性。 缺点:查询变得更加复杂。

对象数据库

您还可以查看面向对象的数据库,例如MongoDB或CouchDB,将人们存储为具有您想要的多个属性的对象。

好处:非常灵活 缺点:不是SQL