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で克服できる
-
広くサポートされた標準なので、多くのプラットフォームでツール提供
- パーサを自前で作らなくていい
-
シリアライズ/デシリアライズ以上の操作も可能
- 【補】XPathとかのことか
-
-
克服できないもの
-
空間効率の悪さ
- 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でデータ構造の中身に対してクエリできない
-
【補】今日びはJSON型のカラムとかありますね
- 中身に対してクエリできる
-
-
-
うまくいく例
- オブジェクトの一部分、SQLでクエリされそうにない部分をLOBとして保存する
-
うまくいかない例
-
LOB外部のオブジェクトがLOB内部のオブジェクトを参照している
- 参照のしくみを考えないといけない
- 不可能ではないがぎこちない
-
XMLだと幾分マシ
- XPathとかある
-
-
レポーティング用のDBと他用途のDBとを分けている場合
- レポーティング用途という時点でたいてい非正規化されている
- Serialized LOBに好適なデータ構造はレポーティングにも好適
Example: Serializing a Deparment Hierarchy in XML
- 略