Entity-Attribute-Valueモデル
ECパッケージ Magento で使われているEAVモデルについて、自分なりに理解できているか確認の意味も込めてまとめます。
誤りなど気づいた方がいらしたら、是非つっこんでください。
まずよくあるユーザーテーブル
▼customer_table
id | name | birthday | address |
---|---|---|---|
1 | sasakure | 1984/12/03 | tokyo shibuya |
2 | tarou | 2002/01/22 | kanagawa kawasaki |
これをEAVモデルにすると下記のようになります。
まずはEntity
▼entities_table
id |
---|
1 |
2 |
Entityは「実態」とか「実在」という意味です。
この場合「ユーザ」を表します。
最低でもidだけあればEntityとして充分です。
次にAttribute
▼attributes_table
id | attributes_name |
---|---|
1 | name |
2 | birthday |
3 | address |
Attributeは「属性」という意味です。
entityが持つ属性を管理します。
そしてValue
▼values_table
id | entities_id | attributes_id | value |
---|---|---|---|
1 | 1 | 1 | sasakure |
2 | 1 | 2 | 1984/12/03 |
3 | 1 | 3 | tokyo shibuya |
4 | 2 | 1 | tarou |
5 | 2 | 2 | 2002/01/22 |
6 | 2 | 3 | kanagawa kawasaki |
Valueは「値」なので、EntityとAttributesの組み合わせに対して値を管理します。
テーブル数は増え、value_tableのレコード数も増えますね。
これがソートされてなかったりしたら、テーブルをパッと見ただけでは
どれがどのユーザーのデータなのかは分かりません。
とあるユーザーの情報を集めるのもSQLならJOINしたりと面倒。
ん、ではなぜEAVモデルを使うのか。
それは柔軟に属性を変えられるからです。
例えばユーザーテーブルに「email」を追加したい場合、従来ならSQLでALTER TABLE文を使います。
もし、既に沢山のユーザーがいる場合は、更新も一苦労です。
例えばですが、とあるユーザーだけ属性を増やしたい場合があったとしても、全ユーザーに属性を増やす事になりますね。
でもEAVモデルならattributes_tableに属性「email」を増やすだけで済みます。
必要なentity(ユーザー)にだけvalueを設定してあげればいいのです。
では、ユーザーテーブルだけでなく、商品テーブルもEAVモデルにしましょう。
それぞれでentities_tableなんかを作る事もできますが、下記のようにすれば
同じテーブルで管理出来るようになります。
▼entity_types_table
id | name |
---|---|
1 | customer |
2 | product |
entityの種類を管理するテーブルを新設
▼entities_table
id | entity_types_id |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
4 | 2 |
customerとproductどちらのentityか分かるようにします。
▼attributes_table
id | entity_types_id | attributes_name |
---|---|---|
1 | 1 | name |
2 | 1 | birthday |
3 | 1 | address |
4 | 2 | name |
5 | 2 | price |
6 | 2 | image |
attributeにも商品情報用の属性を追加すればOKです。
values_tableはそのままで構いません。
どうでしょう? こんなデータの管理方法もあるんですねー。
SQLを書くには面倒な構造ですが、O/RマッパやNoSQLの利用が進むにつれ
EAVモデルを採用するケースも多くなるんだと思いました。