スーパータイプとサブタイプは、午後試験では毎年出題されています。但し、実務では稀なため、スーパータイプ・サブタイプの考え方に慣れてない人も多いと言われています。オブジェクト指向型のプログラミング言語を知っている人であれば、考え方が同じなためイメージが掴みやすいと思います。
スーパータイプとサブタイプについて理解するためにはまずは汎化と特化について知る必要があります。それはスーパータイプとサブタイプは汎化と特化の関係を表現するためのものだからです。
汎化(is-a 関係) | 共通の属性を取り出してスーパータイプを作ること。汎化を行うと、サブタイプには属性の差分だけを記述すれば済むようになる。 |
---|---|
特化(専化) | スーパータイプの属性を引き継ぎ、ほかのサブタイプとの差分の属性のみを持つこと。 |
データベースにおける汎化とは、複数のエンティティに共通する属性及び属性値に着目して、それらをひとつのエンティティにまとめることを言います。例えば、営業社員エンティティと技術社員エンティティがそれぞれ以下の属性を持つとします。
技術社員 ( 社員番号, 氏名, 住所, 開発実績 )
営業社員 ( 社員番号, 氏名, 住所, 営業成績 )
この2つのエンティティに共通する属性は、( 社員番号, 氏名, 住所 )です。そこで、これらの属性をスーパータイプである社員エンティティにまとめます。また、主キーである社員番号と、共通していない属性であると開発実績営業成績は、サブタイプである技術社員と営業社員にそれぞれ残します。
社員 ( 社員番号, 氏名, 住所 )
技術社員 ( 社員番号, 開発実績 )
営業社員 ( 社員番号, 営業成績 )
※本来は、サブタイプ識別子と「社員区分」を追加すべきです。詳細は後述。

スーパータイプのエンティティはサブタイプのエンティティの上部に置き、三角形のようなマークと直線で接続します。サブタイプの主キー値は、スーパータイプの主キー値と一致します。また、主キー名もほぼ一致するため、スーパータイプ・サブタイプの関係にあるエンティティを探すときの重要な手掛かりになります。
排他的サブタイプと共存的サブタイプ
インスタンスは、基本的にスーパータイプとサブタイプの両方に同時に作成されます。例えば、上記例の営業社員が追加されるとスーパータイプである社員エンティティとサブタイプである営業エンティティに同時にひとつずつインスタンスが追加されます。このインスタンスの追加のされ方によって、サブタイプは「排他的サブタイプ」と「共存的サブタイプ」のふたつに分解されます。
排他的サブタイプ
スーパータイプにインスタンスが発生した場合、サブタイプのうち、いずれかひとつのサブタイプにだけ、それに対応するインスタンスが発生するサブタイプが排他的サブタイプになります。 排他的サブタイプを示す場合は下図のように描きます。

ここで社員エンティティを見たとき、その社員が技術社員か営業社員のどちらなのか(どちらのサブタイプにインスタンスが発生しているか)わかりにくいです。そこで「社員区分」のような属性をスーパータイプに追加します。

上図の「社員区分」のようにサブタイプのインスタンスを識別するための属性を「サブタイプ識別子」と言います。
共存的サブタイプ
スーパータイプにインスタンスが作成された場合、サブタイプの両方ともに、それに対応するインスタンスが作成されるサブタイプを共存的サブタイプと言います。

例えば、社員番号3004の植野さんは、技術社員であり、営業社員でもあったとします。その場合、技術社員エンティティと営業社員エンティティの両方にインスタンスが作成されます。この植野さんのような兼務者が一人でも存在すれば、共存的サブタイプに該当します。つまり、共存的サブタイプが排他的サブタイプに優先されます。
共存的サブタイプを示す場合は下図のように描きます。

スーパータイプの属性であるサブタイプ識別子は、「技術社員区分」と「営業社員区分」のふたつがあり、それぞれ「はい」「いいえ」の2値を持ちます。
共存的サブタイプの場合、スーパータイプに持たせるサブタイプ識別子に「○○区分」ではなく、「○○フラグ」という名前にすることも多いです。
排他的サブタイプと共存的サブタイプの判別
スーパータイプとサブタイプの検討を行う場合に、インスタンスが排他的か共存的かどうかを考慮する必要があります。実際、午後Ⅱの問題では、問題文から関係性を読み取るときに、この視点でチェックしないと答えを出せません。
排他的か共存的かというのは、インスタンス(1件1件のデータ)が、複数のサブタイプの中にいずれかひとつにしか属せないのか、それとも複数のサブタイプに属することができるのかの違いです。
それがどちらなのかは問題文から読み取らなければなりません。
排他的サブタイプと判断する場合の記述例
「取引先は、仕入先か得意先がどちらか一方にしか登録できない。」
「仕入先かつ得意先の取引先は存在しない。」
共存的サブタイプと判断する場合の記述例
「取引先は、仕入先か得意先のどちらか一方、または両方に登録することができる。」
問題文に特に記述がない場合もあります。例えば、スーパータイプが「会員」で、サブタイプが「法人会員」と「個人会員」など、常識的に考えて共存できない場合などです。そのように、特に説明のないモノは排他的サブタイプと考えても良いでしょう。
どのサブタイプにも属さないインスタンス
スーパータイプのインスタンスのすべてが、サブタイプのいずれかに含まれる場合、それは「完全なサブタイプ」と表現します。逆に、スーパータイプのインスタンスの中に、どのサブタイプにも含まれないものが存在する場合、それは「不完全なサブタイプ」と表現します。
例えば、スーパータイプ「会員」とサブタイプに「優良会員」、「要注意会員」があったとします。
会員 ( 会員番号, 会員名, 会員区分 )
優良会員 ( 会員番号, ポイント残高 )
要注意会員 ( 会員番号, 会員名, 要注意理由 )
会員を必ず「優良会員」か「要注意会員」のいずれかに分類する場合(例えば、会員区分が、1=優良会員、2=要注意会員のいずれかに必ずなる場合)、それは完全なサブタイプとなります。
しかし、そうではなく、いずれにも属さない会員が存在する場合(例えば、会員区分に、3=その他がある場合)、それは不完全なサブタイプとなります。
要するに、完全か不完全かは、サブタイプ識別子である「○○区分」に取り得る値に「その他」があれば、不完全なサブタイプとなります。「○○区分」ではなく「○○フラグ」(はい、いいえ)で区別することも多いです。その場合は、全ての「○○フラグ」が「いいえ」となります。(例えば、優良会員フラグはいいえ、要注意会員フラグもいいえとなるケースです。)
サブタイプが3つか4つ程度であれば、完全なサブタイプ化はできますが、40、50種類もある場合、その数だけサブタイプ化し、完全なサブタイプとすることは非現実的です。そこで、そういう場合は、数の多い上位から3つか4つをサブタイプ化して、それ以外をサブタイプ化しないという選択をすることがあります。そのようなケースで不完全なサブタイプ化が成立します。
同じ属性のサブタイプ
サブタイプ化されたエンティティの属性が異なるものを「相違のサブタイプ」と表現します。通常はその「相違」を目的にサブタイプ化するため、相違のサブタイプに該当することがほとんどです。
しかし、特殊な事情で属性が同じでもサブタイプ化したほうが良いケースもあります。そのとき行われるのが「同一のサブタイプ化」です。
例えば、以下のようなリレーションシップを考えてみます。

受注明細のサブタイプが在庫品受注明細と直送品受注明細になりますが、ふたつとも属性はまったく同じです。それならサブタイプ化する必要がないと考えるのが普通ですが、このケースでは参照しているインスタンスが異なると言う特徴があります。
受注明細が参照している商品エンティティは在庫品と直送品のふたつのサブタイプに分かれています。さらに、このふたつは排他的なサブタイプなので、それを参照している受注明細も在庫品受注明細と直送品受注明細に分けたほうが扱いやすくなります。受注段階では同じ処理でも、その後の使われ方が異なってくるためです。このような場合に、同一のサブタイプ化が行われます。