🎃

スーパタイプ/サブタイプを使う理由

に公開

なぜスーパタイプ/サブタイプを使うのか?

DBスペシャリスト試験でお馴染みのスーパタイプ/サブタイプですが、これはそもそもなんのためにあるか?と思い、個人的にまとめてみました。

理由1:共通項目を一元管理できる(冗長性の排除)

例:顧客(個人/法人)

Customer(共通) ← スーパタイプ
├─ IndividualCustomer(サブタイプ)
└─ CorporateCustomer(サブタイプ)

こうすることで:

  • 共通カラムを複数テーブルに重複させない

  • 修正は1か所だけで済む

  • 外部キーも一本化できる

  • 正規化&整合性が保てる

⇒ 「共通部分をまとめる」ことが最大の目的。

理由2:NULLだらけテーブルを防げる

1テーブルで全部を持つとこうなります:

id name address 法人番号 契約期限 担当者名 ...
-- ---- ------- ---- ---- ---- ---

ほとんどのレコードがNULLだらけ。

スーパタイプ+サブタイプに分ければ:

  • 共通テーブルはスリム

  • 個別テーブルは必要なカラムだけ

  • NOT NULL / CHECK 制約も貼りやすい

⇒ ストレージ・可読性・運用すべてにメリット

理由3:将来の拡張に強くなる(ALTER地獄回避)

例:Payment

Payment(共通)
├─ Card
├─ BankTransfer
└─(将来追加)QR / Wallet / Crypto …

スーパタイプ構造なら新サブタイプを足すだけで済みますが、まとめテーブル方式だとALTERとNULLカラム祭りになります。

⇒ 変更容易性・保守性のために重要。

理由4:共通処理・検索・集計がやりやすい

「全部まとめて検索したい」「一覧を出したい」ケースは多いです。

SELECT * FROM Customer;

で済むのがスーパタイプの強み。

なければ:

  • UNION地獄

  • IF/CASEだらけ

  • アプリ側の分岐が複雑化

⇒ SQL・コードの両面でメリットがある。

理由5:業務モデルとして自然に表現できる

現実の業務概念は「共通+派生」が当たり前。

  • 顧客(個人/法人)

  • 社員(正規/契約/アルバイト)

  • 車両(乗用車/トラック/バイク)

  • 決済(カード/振込/QR)

スーパタイプを使うと:

  • ER図が理解しやすい

  • ビジネス部門との会話にも使える

  • DDD(ドメイン駆動設計)・OOP(オブジェクト指向プログラミング)とも相性が良い

Discussion