勉強日記

チラ裏

PoEAA ch12 Serialized LOB

martinfowler.com


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 hoge
2 hoge
3 piyo
  • こうする

ordersテーブル

order_id customer_lob
1 1
2 1
3 2

customersテーブル

customer_id customer_lob
1 hoge
2 piyo
  • ある時点でのcustomerのスナップショットを残したいなら前者でも良い
  • 更新時異常をさけるには後者を選ぶ

When to Use It

  • それと意識せずに使われてたりする
  • デメリット
    • SQLでデータ構造の中身に対してクエリできない
      • 【補】今日びはJSON型のカラムとかありますね
        • 中身に対してクエリできる
  • うまくいく例
    • オブジェクトの一部分、SQLでクエリされそうにない部分をLOBとして保存する
  • うまくいかない例
    • LOB外部のオブジェクトがLOB内部のオブジェクトを参照している
      • 参照のしくみを考えないといけない
      • 不可能ではないがぎこちない
      • XMLだと幾分マシ
  • レポーティング用のDBと他用途のDBとを分けている場合
    • レポーティング用途という時点でたいてい非正規化されている
    • Serialized LOBに好適なデータ構造はレポーティングにも好適

Example: Serializing a Deparment Hierarchy in XML