Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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
おわりに ● メタデータは、メタデータのために使いましょう。