PoEAA ch12 Single Table Inheritance

PoEAA勉強メモ

出典: 


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つくる

      • 下記の依存を断ち切る

        • 永続化するDomain Modelクラス
        • DBゲートウェイクラス
    • MapperはDomain Modelの具象クラスごとに作る

      • 型フィールドで判定して使い分ける

英語

  • mount up

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