2012-04-28 9 views
0

私は年齢、性別、趣味などの20以上の属性を持つ各ユーザーが独自のプロファイルを持っている出会い系サイトを持っています。このために、すべての属性が1行にあるuser_profileテーブルがあります。ユーザー属性の値は、dbテーブル - intまたはvarchar?

検索と計算の計算では、属性値をintにする方がよいでしょう。これは、varcharで行うよりもよいでしょう。しかし、名前が値でない場合、すべての属性名をどのように表示するかはわかりません。

 
user_profile 
user_id | gendre | like_pets | drinks | body_type | eyes | hair_color | ... 
1  | 1  | 3   | 2  | 4   | 5 | 5   | ... 
2  | 2  | 4   | 2  | 3   | 3 | 5   | ... 
user_attributes 
id | attr_group | value_name | attr_value 
1 | 1   | male  | 1 
2 | 1   | famale | 2 
3 | 2   | Like pets | 1 
4 | 2   | Have pets | 2 
5 | 2   | Don't like pets | 3 
6 | 3   | Blue  | 1 
7 | 3   | Gray  | 2 
8 | 3   | Green  | 3 
9 | 3   | Brown  | 4 
... 

をしかし、それは私がすべての属性のすべての値の名前を印刷する20個のクエリを作成する必要があることを意味:

は、だから私は2つのテーブルを作成することを考えていました。目の色を印刷するたとえば、私は性別のため、お互い属性に同じ再び

SELECT * FROM user_attributes WHERE attr_group=3 

が必要になります。

これは正しい方法ですか?

+0

おそらくあなたは自分の投稿を慎重に読まなかったでしょう。私は列を使用しますが、列ではint値を使用します。だから私は各列の値の値の名前を印刷するために余分なテーブルが必要です。だから "1"は "煙を出さない"に、 "2"は "煙を出す"になります。 varcharを使用するよりも高速です。 – user1324762

答えて

0

はい、すべての許容値を持つルックアップテーブルを持つことは良いことです。 (はい、たとえ20個ある場合でも)他のテーブルから参照テーブルへの外部キー関係を作成することができます。ルックアップテーブルは、行の挿入/更新時に、コードが存在しません。データを表示する準備ができたら、テーブルに参加して名前を取得します。

+0

20個の結合が必要な場合でも? – user1324762

+0

はい、20個の結合が必要な場合でもそうです。ほとんどの場合、IDだけを取得し、アプリケーションのキャッシュされた参照値のリストに名前を追加することで取得できます。アプリケーションでEnumを使用している場合は、idを適切なenum型にキャストし、それを準許容可能な名前として使用できます。 – robrich

0

あなたが本当にすべての属性のすべての名前が必要な場合は、ちょうどまさにそのためのデータベースを頼む:

SELECT * FROM user_attributes ORDER BY attr_group 

が今、データベースから結果を取得した後、あなたのコード内でグループ化を行います。それらは便利にソートされるので、隣接する行を同じattr_groupでグループ化するのは簡単です。

これをユーザーテーブルに結合するには、別のテーブルを使用して列を(user_id, attr_group, attr_value)にすることをお勧めします。次に、このテーブルとuser_attributesに参加してすべての結果を得ることができます。

+0

Tnx、私はすべてのattr名を表示する必要があるユーザー編集ページにこれを使用します。しかし、ユーザービューページでは、属性ごとに1つの値だけを表示する必要があります。この場合、おそらく20倍の結合を使用するほうがよいでしょうか?または、まだ結合がなく、いくつかの余分なPHPコードを作成するより速いでしょうか? – user1324762

+0

@ user1324762では、特定のユーザーの現在選択されている値を一度に取得するために単一の結合を使用するだけではどうですか? – bdonlan

+0

attrの値がvarcharの場合は可能ですが、検索とマッチの計算ではintとします。この場合、結合は1つしか使用できません。 – user1324762

関連する問題