🎃
スーパタイプ/サブタイプを使う理由
なぜスーパタイプ/サブタイプを使うのか?
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