勉強日記

チラ裏

PoEAA ch12 Single Table Inheritance

martinfowler.com


Single Table Inheritance

Represents an inheritance hierarchy of classes as a single table
that has columns for all the fields of the various classes.

  • RDBは「継承」をサポートしない
  • DBとオブジェクトとのマッピングの際には、継承構造をRDB上で表現する方法を考える必要がある
    • いろいろある
      • Single Table Inheritance
      • Class Table Inheritance
      • Concrete Table Inheritance
  • Single Table Inheritanceは、テーブルのJOINを最小化する向きのもの

How It Works

  • 全派生クラスの和集合的なスキーマ
    • 使わないものは空
    • 型フィールドも持つ
      • どのクラスのインスタンスをインスタンシエートすればよいか判断
  • 型フィールド -- コード or クラス名
コード クラス名
クラス名への変換 必要 不要
空間効率 良い 悪い
テーブルを直接触りやすい o x
  • 【所感】 リレーショナルモデル原理主義者は怒りそう
    • NULLが入ると第一正規形ですらない
    • リレーション分割しろ

When to Use It

  • 他のマッピングパターン
    • Class Table Inheritance
    • Concrete Table Inheritance
  • 比較してのメリデメ
    • メリ
      • テーブル1つだけ考えれば良い
      • JOINなし
      • クラス側で、フィールドを親もしくは子に移動するリファクタリングがDBに跳ねない
    • デメ
      • 関係ないフィールド多数、テーブルを直接触る人は困惑する
        • 【所感】今かかわっている案件がまさにこれ。過度な汎化という感じ
          • ドキュメントがあればまだ違うかも
      • 一部のクラスでしか使わない列は空間の無駄
        • 無駄度合いはRDBMS実装依存
          • 例えば、Oracleは右側の列が空の場合トリミングしてくれる
      • 巨大テーブルが生まれる
        • インデックスいっぱい、頻繁にロッキングする
          • インデックス用の垂直分割テーブルを作成することで回避できる
            • 【所感】JOIN不要という特徴は台無しなのでは
      • 名前空間がひとつなので、カラム名の衝突に気をつける必要がある
  • 複数のTable Inheritanceパターンを混用してもよい
    • 似ているクラスはSingle Table Inheritanceでまとめる
    • 特有のデータが多いクラスはConcrete Table Inheritanceで切り出す

コード例

  • かいつまんでメモ
    • Mapperつくる
      • 下記の依存を断ち切る
    • MapperはDomain Modelの具象クラスごとに作る
      • 型フィールドで判定して使い分ける

英語

  • mount up
    • to gradually increase in number or amount
    • to gradually become larger in amount