PoEAA ch12 Serialized LOB

PoEAA勉強メモ

出典: 


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 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だと幾分マシ

        • XPathとかある
  • レポーティング用のDBと他用途のDBとを分けている場合

    • レポーティング用途という時点でたいてい非正規化されている
    • Serialized LOBに好適なデータ構造はレポーティングにも好適

Example: Serializing a Deparment Hierarchy in XML