データベースの概念データモデル(ER図)の中にスーパタイプとサブタイプという考え方があります。
「スーパとサブ」なので、上下関係があるような言葉に思えますが、その通りです!
今回はこのスーパタイプとサブタイプを解説していきます。
汎化と特化の関係とは?
概念データモデルにおいて、インスタンスが業務上何かの基準に従って区分ができる場合に「スーパタイプとサブタイプ」という関係を作ることができます。
下の図を見て頂ければ分かるかと思いますが、「社員」が「正社員」、「契約社員」、「嘱託社員」に分けられた時にスーパタイプが「社員」となり、その他が「サブタイプ」となります。
これは「オブジェクト指向」における「汎化」と「特化」の関係と同様になり、汎化した側のエンティティをスーパタイプ、特化した側のエンティティをサブタイプとします。
スーパクラスとサブクラスには以下の2つのルールがあります。
ルール1:スーパクラスとサブクラスは主キーが一致する。
ルール2:スーパクラスには各サブクラスを割り当てるための区分が存在する。
様々なパターン
スーパタイプとサブタイプの関係には、様々なパターンがあります。これから代表的なパターンの解説をしていきます。
排他的サブタイプ
排他的サブタイプと何だか難しい言葉ですが、簡単に言うと「スーパタイプがどれか一つをサブタイプとして選ぶ関係」のことです。
下の例ですと、商品は商品区分として「販売品」か「貸出品」のどちらかにしか登録できません。販売品かつ貸出品になることができない、ということですね。
ですので、スーパタイプとしては、関係スキーマに「区分」という属性を持たせて、サブタイプをどれか一つ指し示すようになります。
共存的サブタイプ
共存的サブタイプは、簡単に言うと「スーパタイプがどれでも(一つでも複数でも)をサブタイプとして選択できる関係」のことです。
下の例ですと、商品は商品区分として「販売品」か「貸出品」のどちらか一方、または両方登録できません。販売品でもあり、貸出品にもなる、ということですね。
スーパタイプとしては、関係スキーマに「フラグ」という属性を持たせて、サブタイプを個々に指定することができます。
包含(ほうがん)
最後は「包含」です。これはあるエンティティに含まれるインスタンスが、別のエンティティの一部として全てに含まれていることです。
下の例ですと、商品のエンティティに販売品のエンティティが含まれていますが、その他のエンティティ(例えば貸出品、在庫品など)も存在するということです。
二つのエンティティが完全に一致する訳では無く、集合体で言うところの部分集合と同じですね。
まとめ
今回はデータベースにおけるスーパタイプとサブタイプに関して学んでみました。
各エンティティの関係を表すためのものであることが分かりましたが、色々なパターンがあるのですね。
「汎化と特化」という難しい言葉も出てきましたが、関係スキーマや集合体で考えてみると理解し易くなると思います。
概念データモデルを作る時に、排他的サブタイプなのか共存的サブタイプなのかを、きちんと見極める必要がありますね。
以上です!