私は、ユーザが "オブジェクト"定義をリアルタイムで作成できるエディタを開発中です。定義には、0個以上のプロパティーを含めることができます。プロパティの名前はa型です。定義が作成されると、ユーザーはその定義のオブジェクトを作成し、そのオブジェクトのプロパティ値を設定できます。動的プロパティをサポートするスキーマ
したがって、マウスボタンをクリックすることで、ユーザーはそうする必要があります。 "Bicycle"という新しい定義を作成し、 "Numeric"型の "Size"プロパティを追加することができます。次に、 "Text"型の "Name"と呼ばれる別のプロパティーと、 "Numeric"型の "Price"という別のプロパティーがあります。それが完了すると、ユーザーは2つの「自転車」オブジェクトを作成し、各自転車の「名前」および「価格」プロパティ値を記入できるようになります。
ここでは、いくつかのソフトウェア製品でこの機能を見てきました。したがって、これはよく知られた概念でなければなりません。私の問題は、私が座ったときに始まり、このデータ構造をサポートするDBスキーマを考え出しました。なぜなら、適切な列タイプを使用してプロパティ値を格納したいからです。つまり数値プロパティ値は、例えばINTとしてデータベースに格納され、テキストプロパティ値はVARCHARとして格納されます。
まず、私はすべてのオブジェクト定義を保持するテーブルが必要になります。
Table obj_defs
id | name |
----------------
1 | "Bicycle" |
2 | "Book" |
それから私は、各オブジェクト定義が持つべき性質の種類を保持するためのテーブルが必要になります。
Table prop_defs
id | obj_def_id | name | type |
------------------------------------
1 | 1 | "Size" | ? |
2 | 1 | "Name" | ? |
3 | 1 | "Price" | ? |
4 | 2 | "Title" | ? |
5 | 2 | "Author" | ? |
6 | 2 | "ISBN" | ? |
私は
Table objects
id | created | updated |
------------------------------
1 | 2011-05-14 | 2011-06-15 |
2 | 2011-05-14 | 2011-06-15 |
3 | 2011-05-14 | 2011-06-15 |
最後に、私はテーブルを必要とします各オブジェクトの実際のプロパティ値を保持し、一つの解決策は、このような、それぞれの可能な値のタイプごとに1つの列を有するようにこのテーブルにあるでしょう:
Table prop_vals
id | prop_def_id | object_id | numeric | textual | boolean |
------------------------------------------------------------
1 | 1 | 1 | 27 | | |
2 | 2 | 1 | | "Trek" | |
3 | 3 | 1 | 1249 | | |
4 | 1 | 2 | 26 | | |
5 | 2 | 2 | | "GT" | |
6 | 3 | 2 | 159 | | |
7 | 4 | 3 | | "It" | |
8 | 5 | 3 | | "King" | |
9 | 6 | 4 | 9 | | |
私はこのスキーマを実装した場合、どのような「タイプ」希望prop_defsテーブルの列は保持されますか?各列名に対応する整数、単に列名を保持するvarchars?他の可能性は?ストアドプロシージャは何らかの形で私をここで助けますか?そして、オブジェクト2の "名前"プロパティを取得するためのSQLはどのように見えますか?
優秀な回答!ありがとうございました:) –
EAVはアイテムを入れ子にする必要があるときに避けるべきことがある場合に、より良い解決策になります。 – ChrisR
MongoDBのようなNoSQLソリューションでは、EAVは最終的に死ぬことができます。 –