2011-12-08 6 views
1

peopleというテーブルとpeople_attributesというテーブルがあります。多くの属性を持つテーブルデザインですか?

私のサイトの人々は、青い目、茶色の髪、薄いのようなさまざまな属性を提出し、属性を持つすべてのユニークな人物を返す必要があります。

私のテーブルデザインに苦しんでいます。 peopleテーブルの1人は多くの属性を持つことができます。各人の属性を人のテーブルにどのように保存する必要がありますか?

属性の型とそのIDを持つユーザーのIDで別のテーブルを作成する必要がありますか?

しかし、この考え方では、属性には多くの人がいる可能性があります。多くの人物が接続された属性を保存するにはどうしたらよいですか?コンマで区切られたリスト?しかし、私はそれをどのように探しますか?そして、私はどのようにしてユニークな人々だけを返しますか?私は青い目と茶色の髪を探していた場合、カテゴリの青い目は人1を持ち、茶色の髪になります。したがって、クエリは2人の1を返すでしょう。

答えて

4

何についてPeople(id, name, etc.), Attributes(id, description), People_Attribute(people_id, attribute_id)

+0

SQLない人々が繰り返さ大量のデータを持っている属性テーブルではないでしょうか?だから、もし人1が、背の高い、灰色の髪、青い目、属性を持っているなら、眼鏡をかける...それは4行ではないでしょうか?または、すべての属性を1つの行に配置できますか? – beans

+0

はい、4つの行があります...それぞれはその人に固有です。 1列にすべてのデータがある場合は、グレーの髪の人、眼鏡をかけた人、背の高い人をどのように検索しますか? – 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 
.... 

利点 - 報告のスピード、維持しやすいです。わかりやすいクエリ 難点 - 柔軟性がない。新しい列を追加するのが難しく、列の数が制御不能になることがあります。

別々の属性この場合、表

、あなたは、人/属性値ごとに1行を別の属性テーブルを持っているでしょう。これはあなたに青い目と茶色の髪の色

利点を持っていたすべての人々のリストを与えるだろう

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') 

:無限に拡張、無制限

Table People: 
ID 
Name 

Table Attributes 
ID 
Name 

Table Attributes_people 
ID 
People_ID 
Attributes_id 
Value 

クエリは、次にようになります。 1人あたりの属性の数。 欠点:クエリがより複雑になります。

オブジェクトDB

また、あなたが好きなように多くの属性を持つオブジェクトとして人々を保存するために、このようなMongoDBのか、CouchDBのようなオブジェクト指向のデータベースに見ることができます。

利点:非常に柔軟 ダウンサイド: