ROUTE 3390

備忘録的な用途で書いていますが、どなたかの役に立つ事があれば嬉しいです。

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モデルを採用するケースも多くなるんだと思いました。