スーパータイプとサブタイプ(supertype / subtype)
共通する部分を上にまとめたものがスーパータイプ、それぞれ固有の部分を持つ下位がサブタイプ。空欄の列を減らすために分ける。
もう少し詳しい説明
どんなときに分けるのか
受講者を管理する例で考えます。受講者には社員と社外の人がいます。
| 項目 | 社員 | 社外の人 |
|---|---|---|
| 受講者コード | ある | ある |
| 氏名 | ある | ある |
| 所属部署コード | ある | ない |
| 勤務先の会社名 | ない | ある |
1つの表にまとめると、どちらかの列が必ず空欄になります。
| 受講者コード | 氏名 | 所属部署 | 勤務先 |
|---|---|---|---|
| 0001 | (社員) | 営業部 | 空欄 |
| 0002 | (社外) | 空欄 | ○○商事 |
空欄になる列は、見分けが付きません。 「値がまだ入っていない」のか「そもそも当てはまらない」のかが区別できません。
分けた形
| 表 | 立場 | 持つ列 |
|---|---|---|
| 受講者 | スーパータイプ(上位) | 受講者コード、氏名、区分 |
| 社員受講者 | サブタイプ(下位) | 受講者コード、所属部署コード |
| 社外受講者 | サブタイプ(下位) | 受講者コード、勤務先の会社名 |
共通する列は上、固有の列は下に置きます。
| 決まり | 中身 |
|---|---|
| サブタイプの主キー | スーパータイプの主キーと同じ列にする |
| サブタイプの主キー | 同時に、スーパータイプへの外部キーにもなる |
| 1件のデータ | スーパータイプに1行、該当するサブタイプに1行 |
区分属性
どのサブタイプなのかを見分けるための列です。タイプ属性とも呼びます。
| 受講者コード | 氏名 | 区分 |
|---|---|---|
| 0001 | (社員) | 1(社員) |
| 0002 | (社外) | 2(社外) |
この列があると、サブタイプを見に行かずに種類が分かります。 区分の値に何を入れてよいかは、定義域制約で決めます。
2つの性質
| 性質 | 問い | 例 |
|---|---|---|
| 排他か | 1件が同時に複数のサブタイプになれるか | 社員と社外を兼ねられるか |
| 網羅しているか | すべての行がどれかのサブタイプに入るか | どちらにも入らない受講者がいるか |
排他で、かつ網羅しているなら、区分属性1つで表せます。 兼ねられる場合は、区分を1列で表せません。
上に残してよい列、残してはいけない列
ここが設問の分かれ目になります。
| その列が当てはまる範囲 | 置く場所 |
|---|---|
| すべての種類に当てはまる | スーパータイプ |
| 一部の種類だけに当てはまる | そのサブタイプ |
片方にしか当てはまらない列が上に残っていると、もう片方で空欄になります。 改修の問題では、「この属性をどちらに置くか」が直接問われます。
どこまで分けるか
| 分けると | 分けないと |
|---|---|
| 空欄の列がなくなる | 空欄が残る |
| 列の意味がはっきりする | 「当てはまらない」と「未入力」が混ざる |
| 問合せで結合が必要になる | 1つの表で済む |
| 表の数が増える | 少なく保てる |
固有の列が1つか2つしか無い場合は、分けないこともあります。 分けることで増える手間と、空欄が残る不都合を比べる形です。
プログラムの側の考え方との対応
| データベース | オブジェクト指向 |
|---|---|
| スーパータイプ | スーパークラス(汎化した側) |
| サブタイプ | サブクラス(特化した側) |
考え方は同じです。 共通部分を上に、固有部分を下に置きます(オブジェクト指向のページで扱っています)。
試験ではこう出る
科目A(旧・午前)では、上下の意味が問われます。共通部分が上、固有部分が下です。
午後や応用情報(データベース)では、E-R図の中で上下に並べて描かれます。 問われるのは次の2つです。
| 問われ方 | 答えるもの |
|---|---|
| この属性はどこに置くか | 当てはまる範囲で決める |
| サブタイプの主キーは何か | スーパータイプの主キーと同じ列 |
解答群が無く、属性名を自分で書くことが多いので、問題文の他の表で使われている名前の付け方に合わせてください。
関連する用語
- E-R図
- この分け方を描く図。上下の関係として示す
- 正規化
- 同じ事実を1か所にまとめる整理。目的が近い
- 主キー
- サブタイプの主キーは、スーパータイプの主キーと同じ列にする
- クラス図
- 同じ考え方をプログラムの側で表した図。汎化と特化
ミニクイズ
スーパータイプとサブタイプに分ける設計の目的として、最も適切なものはどれか。
正解は 4番:一部の種類にしか当てはまらない属性を下位に移し、値が入らない列が生じるのを避けること
共通する属性を上位にまとめ、一部の種類にしか当てはまらない属性を下位に置くのがこの設計です。1つの表にまとめると、当てはまらない種類の行でその列が空欄になります。行数で分けるのは分割の別の手法で、よく使う列を写すのは性能を上げるための重複の持たせ方です。同じ列を複数の表に持たせるのは、同じ事実を1か所にまとめる考え方とは逆向きになります。
この分野をまとめて解く → データベースのミニテスト(全35問)
最終更新:2026-11-09