PoEAA ch12 Serialized LOB
Serialized LOB
Saves a graph of objects by serializing them into a single large object (LOB), which it stores in a database field.
- 複雑なオブジェクトグラフの永続化
- 【補】Composite Patternとか
- RDBのスキーマに落とし込むのは難しい
- テーブル定義自体は簡単
parent_id
とか持てばいい
- データ操作が困難
- 【補】SQL Antipatterns -- Naive Tree
- テーブル定義自体は簡単
- オブジェクトは必ずしもテーブルの行として永続化されなければならない、ということはない
- LOB: Large OBjectにシリアライズして1カラムに突っ込んでも良い
- GoF -- Memento Pattern
How It Works
- LOBの種類
- BLOB: Binary LOB
- CLOB: Character LOB
- 良し悪し
BLOB | CLOB | |
---|---|---|
読み書きがシンプル | o | x |
空間の効率 | o | x |
速度 | o | x |
DBのBLOBデータ型 | 必要 | 不要 |
human-readable | x | o |
後方互換 | x | o |
パーサ | たいてい不要 | 必要 |
- CLOBの欠点の多くはXMLで克服できる
- 克服できないもの
- 空間効率の悪さ
- XMLはとてもverboseなのでとくに悪い
- zip圧縮するという選択肢
- human-readabilityを捨てて空間効率を上げる
- 【補】xlsxフォーマットがまさにこれ
- 空間効率の悪さ
- データの重複に気をつける
- 重複しているケース
ordersテーブル
order_id | customer_lob |
---|---|
1 | |
2 | |
3 | |
- こうする
ordersテーブル
order_id | customer_lob |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
customersテーブル
customer_id | customer_lob |
---|---|
1 | |
2 | |
- ある時点でのcustomerのスナップショットを残したいなら前者でも良い
- 更新時異常をさけるには後者を選ぶ
When to Use It
- それと意識せずに使われてたりする
- デメリット
- うまくいく例
- オブジェクトの一部分、SQLでクエリされそうにない部分をLOBとして保存する
- うまくいかない例
- レポーティング用のDBと他用途のDBとを分けている場合
- レポーティング用途という時点でたいてい非正規化されている
- Serialized LOBに好適なデータ構造はレポーティングにも好適
Example: Serializing a Deparment Hierarchy in XML
- 略