2010-12-08 11 views
0

私は、ユーザー情報を格納するテーブルのユーザー持っている - 保存を目的とした - などの名前、生年月日、場所、などリレーショナルデータベース設計(MySQLの)

を私はUser_Optionsと呼ばれるリンクテーブルをも作成しました複数値の属性 - これは基本的にチェックボックスの選択を保存します。

私はユーザーが入力してユーザープロファイルを作成するためのフロントエンドフォームを持っています。ここで私は、チェックボックスの選択肢を生成するために作成したテーブルです: - 趣味のための1セットと音楽のための1つのセットだから、

 
Table User_Attributes 
===================== 
id attribute_name 
--------------------- 
1  Hobbies 
2  Music 
 
Table User_Attribute_Options 
====================================== 
id user_attribute_id option_name 
-------------------------------------- 
1  1     Reading 
2  1     Sports 
3  1     Travelling 
4  2     Rock 
5  2     Pop 
6  2     Dance 

は、フロントエンドのフォーム上のチェックボックスのオプションの2セットがあります。

そして、ここでユーザーテーブルです:

 
Table User 
======================== 
id name   age 
------------------------ 
1  John   25 
2  Mark   32 
 
Table User_Options 
================================================== 
id user_id   user_attribute_id  value 
-------------------------------------------------- 
1  1    1      1 
2  1    1      2 
3  1    2      4 
4  1    2      5 
5  2    1      2 
6  2    2      4 

は、(上記の表に「user_attribute_idは」親属性のIDであると「の値が」属性オプションのIDです)。

私はこれを正しく、または効率的に実行したとは確信していません。同じテーブルに階層データを格納する方法があることは分かっていますが、私は物事を分けておくほうが好きです。

私の主な関心事は、User_Optionsテーブルです。この背後にあるアイデアは、各多値属性のテーブルを持つのではなく、複数値の属性を格納するリンクテーブルが1つだけあればよいということです。

答えて

1

私が変更することがわかる唯一のことは、関連付けテーブルUser_Optionsに、目的を果たさないIDがあることです。そのテーブルのプライマリキーは3つのカラムすべてになります。ユーザがidによって持っているオプションを参照しているとは思えません。あなたはuser_id/user_attribute_idでそれらを取得しています。たとえば、userが1、user属性が2のすべてのユーザーオプションを教えてください。これらのレコードを別のフィールドで一意にキーにするのは無意味です。

私はそうでなければ、テーブルの一般的な形とその関係が私に正しいと思う。

1

あなたのやり方は何も問題ありません。

より多くのリンクテーブル参照(およびクエリの構成)の代償で、物事をより拡張可能にすることができます。物事をフラットにし、拡張性と柔軟性に欠ける可能性もありますが、クエリは高速になります。

しかし、通常そうであるように、それを行う方法は複数あります。

関連する問題