我有一个名为people
的表,另一个名为people_attributes
。
在我的网站上,人们提交了各种属性,比如蓝眼睛,棕色头发,瘦身,我需要返回所有具有属性的独特人物。
我正在努力摆弄桌面设计。 people
表中的一个人可以拥有许多属性。我应该如何在人员表中保存每个人的属性?
或者我应该创建一个单独的表格,其中包含属性类型和拥有它的人的ID?
但是有了这个想法,一个属性可以有很多人,我怎样才能存储一个附加了许多人的属性,但仍然只能找到独特的人?逗号分隔列表?但是我该怎么搜索呢?我怎样才能归还独特的人? I.E如果我正在寻找蓝色的眼睛和棕色的头发,那么蓝色的眼睛会有人1,棕色的头发也是如此。因此查询将返回两个人1。
答案 0 :(得分:4)
People(id, name, etc.), Attributes(id, description), People_Attribute(people_id, attribute_id)
怎么样?
答案 1 :(得分:0)
您可以创建树表:
您可以在以下表格中搜索:
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