【DB】概念データモデルにおけるスーパタイプとサブタイプ

  • 2022年6月8日
  • 2023年3月4日
  • DB
DB

概念データモデルではエンティティが実体として表現されます。このエンティティをスーパタイプとサブタイプに分けるという考え方があります。

いきなりそんなの言われましても、、って感じなので、スーパタイプ・サブタイプとは?というところを、具体的な例を交えながら見ていきたいと思います。

スーパタイプ・サブタイプとは

スーパタイプとサブタイプは汎化と特化の関係を表現したものです。様々なエンティティの中に共通する属性だけを持つものがスーパタイプです。一方、スーパタイプの属性を引き継ぎ、さらにそのエンティティを特徴づける属性を保持したものがサブタイプです。

複数のエンティティから共通する属性を取り出し、スーパタイプを作成することを「汎化」と言います。一方、スーパタイプの属性を引き継ぎ、さらにそのエンティティを特徴づける属性を保持することを特化といいます。

車を例に見てみます。単に車と行っても軽自動車やワゴンにセダン、スポーツカーなどそのジャンルは様々あります。ただし、それぞれ車としての共通の特徴も有しています。

こういう場合、エンティティを汎化/特化してスーパタイプとサブタイプに分けることができます。

車の概念データモデル
概念データモデル

このときスーパタイプの属性には主キーとなるコードの他、車名や価格などが入ります。また、サブタイプを識別するための区分データも保持する必要があります。

サブタイプの主キーはスーパタイプのものと同じです。ただし、名称がサブタイプ特有のものになっている場合もあります(この場合でも値自体は同じ)。そして、スーパタイプの主キー以外の属性はサブタイプに継承されます。サブタイプの主キー以外の属性は、サブタイプ特有の情報です。

例えば、スポーツカーにしかMT車がない場合、AT/MT区分はサブタイプ「スポーツカー」の属性となります。

属性を持った例
属性を持った例

このときサブタイプ「スポーツカー」は、スーパタイプである「車」の属性である車名、価格に加え、「スポーツカー」独自の属性であるAT/MT区分を保持します。

また、「軽自動車」と「セダン」ではともに最大乗車人数という属性を保持しています。このように、複数のサブタイプで同一の属性を保持することも可能です。ただし、全てのサブタイプに共通して存在するような項目であれば、スーパタイプの属性として汎化する必要があります。

排他的サブタイプ・共存的サブタイプ

サブタイプには大きく2つの種類があります。排他的サブタイプと共存的サブタイプです。これは、インスタンス(1件のデータ)がどれか1つのサブタイプにしか属せないのか、それとも複数のサブタイプ属することが可能かという違いです。

例えば上記の例で考えてみます。この場合、インスタンスとは具体的な車(車種)です。クラウンはセダンに属し、軽自動車やスポーツカーにはなりえません。一方、シビックはスポーツカーであり、セダンでもワゴンでもありません。(※車名がわからないときは調べてみてください)

このように1つのインスタンスが複数のサブタイプに属することがない場合は排他的サブタイプとなります。

もっとわかりやすい例で排他的サブタイプと共存的サブタイプを比較してみましょう。テーマはガラッと変わって、取引先を例に考えてみます。取引先には、自分が物を買う「仕入先」と、自分が物を売る「得意先」があります。

このとき「取引先」がスーパタイプ、「仕入先」と「得意先」がサブタイプになります。そしてこのサブタイプは場合によって排他的にも共存的にもなります。

排他的になる場合

排他的サブタイプになる場合とは、例えば以下のような条件がある場合です。

  • 取引先は仕入先または得意先どちらかにしか登録できない
  • 仕入先かつ得意先の取引先は存在しない

この場合、インスタンスであるA社を考えると、仕入先か得意先の一方にしか属せないので排他的サブタイプとなります。

概念データモデルにすると以下のようになります。

排他的サブタイプ
排他的サブタイプ

共存的になる場合

以下のような条件があれば共存的サブタイプとなります。

  • 取引先は仕入先および得意先のどちらか一方、または両方に登録できる

この場合、インスタンスであるA社は仕入先、得意先の両方に属することができます。

概念データモデルにすると以下のようになります。排他的の場合と異なり、矢印が合流しません。なおインスタンスがどのサブタイプに属するかを識別するために、スーパタイプにフラグなどサブタイプを識別する属性を持たせるのが一般的です。

共存的サブタイプ
共存的サブタイプ

DBについてより学ぶ

データベース、SQLについて、書籍を通してより深く知ることができます。ネットでも情報は手に入りますが、書籍も是非検討してみてください^^

まとめ

概念データモデルにおけるスーパタイプとサブタイプについて内容をまとめました。プログラミングの経験がある方は、オブジェクト指向と似ているなと思ったのではないでしょうか。

汎化や特化の考え方は、同じ属性をそれぞれのエンティティで何個も持たず、まとめて管理し酔うというものです。その方が合理的で、運用面でもメリットが大きいですからね。

少しずつ知識を付けていきましょう(筆者も同じく)。

ではでは👋