Slide 1

Slide 1 text

SQLアンチパターン読書会 5章 「EAV(エンティティ・アトリビュート・バリュー)」 2013/06/27 @grimrose

Slide 2

Slide 2 text

章構成 ● 目的 ○ 可変属性をサポートする ● アンチパターン ○ 汎用的な属性テーブルを使用する ■ 属性を取得するにはどうするか ■ データの整合性をどう保つのか ■ 行を再構築しなければならない ● アンチパターンの見つけ方 ● アンチパターンを用いてもよい場合

Slide 3

Slide 3 text

章構成 ● 解決策 ○ サブタイプのモデリングを行う ■ シングルテーブル継承 ■ 具象テーブル継承 ■ クラステーブル継承 ■ 半構造化データ ■ 後処理

Slide 4

Slide 4 text

EAVとは ● エンティティ ● 属性(アトリビュート) ● 値(バリュー)

Slide 5

Slide 5 text

EAV issue_id attr_name attr_value 1234 product 1 1234 date_reported 2009-06-01 1234 status NEW 1234 description 保存処理に失敗する 1234 reported_by Bill 1234 version_affected 1.0 1234 severity 機能の損失 1234 priority HIGH IssueAttribytes

Slide 6

Slide 6 text

デメリット ● 属性を取得するのが冗長 ● 必須属性を設定できない ● データ型を使えない ● 参照整合性を強制できない ● 属性名を補わなければならない ● 行を再構築しなければならない

Slide 7

Slide 7 text

可変属性を使うには ● NoSQL ● サブタイプ

Slide 8

Slide 8 text

NoSQL ● Key/Value型 ● カラム指向型 ● ドキュメント指向型 ● etc...

Slide 9

Slide 9 text

サブタイプ ● うまく機能するのは? ○ サブタイプの数が限られる ○ 開発者が各サブタイプの属性をよく知っている

Slide 10

Slide 10 text

シングルテーブル継承 ● 属性を全て個別の列に格納

Slide 11

Slide 11 text

具象テーブル継承 ● サブタイプ毎にテーブルを作成 ● 基底型と固有の属性を含む

Slide 12

Slide 12 text

クラステーブル継承 ● 基底型テーブルとサブタイプ毎にテーブルを追 加

Slide 13

Slide 13 text

ORM ● 各テーブル継承をサポートしている場合も ● Ruby ○ ActiveRecord ● PHP ○ doctrine2 ● Java ○ JPA ● Python ○ SQLAlchemy

Slide 14

Slide 14 text

半構造化データ ● その他の属性をBLOB、CLOB、TEXT型に格納

Slide 15

Slide 15 text

後処理 ● 行の集合として取得し、アプリケーションで何と かする。

Slide 16

Slide 16 text

おわりに ● メタデータは、メタデータのために使いましょう。