理系学生日記

おまえはいつまで学生気分なのか

PoEAA: Single Table Inheritance

Single Table Inheritance は、オブジェクトモデルにおいて表現された継承関係を DB にマッピングするためのデザインパターンの 1 つで、 継承関係にある各クラスのフィールドを 1 つのテーブルに集約させるという設計になります。他のパターンとしては、後日に読む

  • Class Table Inheritance
  • Concrete Table Inheritance

があります。

クラスを DB に永続化するとき、対象クラスに存在するフィールドはそのまま DB に反映されますが、存在しないフィールド値は、対応する DB 上のカラムに null で格納されます。 一方、DB 上のデータをオブジェクトにマッピングするときは、対象レコードが継承ツリー上のどのクラスを表現しているのかを、別カラムで表現しておく必要があります。

パターンの長所

  1. 1 テーブルのみを対象としておけば良くシンプル
  2. データを取得するときに JOIN が必要ない
  3. 特定のフィールドを継承ツリー上のどのクラスに移動したとしても、テーブル設計に影響を与えない

パターンの短所

  1. 特定のクラスでしか使われないカラムによって DB 容量が消費されてしまう
  2. 1 テーブルにデータが集中するため、パフォーマンス劣化に繋がる