ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

概念データモデルのスーパータイプとサブタイプのパターン

はじめに

データベーススペシャリスト試験の「概念データモデルと関係スキーマ」問題ではスーパータイプとサブタイプの見極めが重要となります。

スーパータイプとサブタイプの定義は多くのテキストや資料で説明されていますが、その知識のみで問題に臨むとパターンの多さに面食らうことになります。

そこで、本エントリではデータベーススペシャリスト試験の問題からパターンを整理し、まとめることにしました。

本エントリで挙げる例はいずれもデータベーススペシャリスト試験の問題(平成23~31年度午後Ⅱ)からとなります。ただし、わかりやすさを考慮して一部改変している箇所があります。ご了承ください。

定義と基本パターン

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

スーパータイプとサブタイプとは汎化・特化関係を表現したものです。汎化とは共通の属性を取り出してスーパータイプを作ることです。特化とはスーパータイプの属性を引き継ぎ、差分の属性のみを持つことです。

ここから、サブタイプは以下の特徴を持つといえます。

  • サブタイプはスーパータイプの一部である
    • サブタイプはスーパータイプの部分集合である、ともいえる
  • サブタイプ固有の属性を持つ

関係スキーマでの特徴を以下に示します。

① 主キー若しくは候補キーがスーパータイプ・サブタイプで同一になる。
スーパータイプとサブタイプで主キーが一致する、と説明されることもありますが、実際には異なることがあります。例えば、主キーが一致せず、スーパータイプの主キーとサブタイプの候補キーで一致することがあります。

② スーパータイプは主キー以外の属性にサブタイプを識別するための区分を持つことがある。
サブタイプを識別するための区分がスーパータイプに必ず存在するかのように説明されていることもありますが、実際には存在しないこともあります。

排他的サブタイプ

排他的とはインスタンス(各データ)が複数のサブタイプのいずれか一つにしか属することができないことを指します。

平成30年度午後Ⅱ問2 を参考にします。

【概念データモデル】

排他的サブタイプの概念データモデル

【関係スキーマ

取引先(取引先コード, 取引先名, 取引先住所, 取引先区分)
 得意先(取引先コード, 契約先フラグ, 出荷先フラグ)
 仕入先(取引先コード, 支払区分)

【ベン図】

排他的サブタイプのベン図

スーパータイプに "区分" を持たせてサブタイプを識別しています。

問題文には『得意先と仕入先の両方に該当する取引先は存在しない』とあり、サブタイプの "得意先" もしくは "仕入先" のいずれか一つにしか属しないとわかります。

共存的サブタイプ

共存的とはインスタンス(各データ)が複数のサブタイプに属することができる(いずれか一つでもよい)ことを指します。

平成30年度午後Ⅱ問2 を参考にします。

【概念データモデル】

共存的サブタイプの概念データモデル

【関係スキーマ

得意先(取引先コード, 契約先フラグ, 出荷先フラグ)
 契約先(取引先コード, 契約ランク)
 出荷先(取引先コード, 出荷先区分)

【ベン図】

共存的サブタイプのベン図

スーパータイプに "フラグ" を持たせてサブタイプを識別しています。

問題文には『契約先は契約先フラグで識別し、出荷先は出荷先フラグで識別する。一つの得意先が契約先と出荷先を兼ねることもある。』とあり、サブタイプの "契約先" と "出荷先" のいずれかもしくは両方に属することがあるとわかります。

完全/不完全

「完全なサブタイプ」とはスーパータイプのインスタンスの全てがサブタイプのいずれかに含まれることです。

「不完全なサブタイプ」とはスーパータイプのインスタンスの中に、どのサブタイプにも含まれないものが存在するということです。

不完全な排他的サブタイプ・共存的サブタイプのベン図の例を以下に挙げます。

【不完全な排他的サブタイプのベン図】

不完全な排他的サブタイプのベン図

【不完全な共存的サブタイプのベン図】

不完全な共存的サブタイプのベン図

応用パターン

排他的サブタイプと共存的サブタイプの組み合わせ

1つのスーパータイプが排他的サブタイプと共存的サブタイプを併せ持つことがあります。

平成30年度午後Ⅱ問2 を参考にします。

【概念データモデル】

排他的サブタイプと共存的サブタイプの組み合わせ

【関係スキーマ

品目(品目コード, 品目名, 製造品目フラグ, 発注品目フラグ, 受注投入品目区分)
 受注品目(品目コード, 標準販売単価)
 投入品目(品目コード, 投入方法)
 製造品目(品目コード, 製造ロット数量)
 発注品目(品目コード, 仕入取引先コード)

各リレーションの説明を問題文から引用します。
『品目には、受注品目(得意先から受注する品目)、投入品目(製造に必要な品目)、製造品目(自社で製造する品目)、発注品目(仕入先に発注する品目)がある。』

概念データモデル及び関係スキーマより、受注品目かつ製造品目とすることや、受注品目かつ製造品目かつ発注品目とすること、などが表現できるとわかります。

サブタイプと外部キーの組み合わせ

サブタイプと外部キーの組み合わせとなることがあります。

平成29年度午後Ⅱ問2 を参考にします。

【概念データモデル】

サブタイプと外部キーの組み合わせ

【関係スキーマ

得意先(得意先コード, 得意先名, 請求得意先フラグ, 請求得意先コード
 請求得意先(得意先コード, 集約対象得意先数)

外部キーは "得意先.請求得意先コード" と "請求得意先.得意先コード" の関連を示しています。"得意先.得意先コード" と "請求得意先.得意先コード" の関連に対してではないことに注意してください。

"区分" も "フラグ" もないスーパータイプ

スーパータイプは "区分" や "フラグ" でサブタイプを識別すると説明されることが多いですが、これらを持たないケースがあります。

平成29年度午後Ⅱ問2 を参考にします。

【概念データモデル】

区分もフラグもないスーパータイプ

【関係スキーマ

注文(注文番号, 注文年月日)
 地域得意先注文(注文番号, 地域得意先コード)
 広域得意先注文(注文番号, 広域得意先コード)

"区分" や "フラグ" があってもサブタイプがあるとは限らない

リレーションの属性に "区分" や "フラグ" があっても、サブタイプがあるとは限りません。

平成30年度午後Ⅱ問2 を参考にします。

【概念データモデル】

区分やフラグがあってもサブタイプがあるとは限らない

【関係スキーマ

出荷先(取引先コード, 出荷先区分)

サブタイプはスーパータイプに対し差分の属性のみを持ちます。問題文では "出荷先区分" の意味を説明していませんが、区分による差分の属性が存在していないと推測できます。

1つだけのサブタイプ

サブタイプは複数あるとは限らず、1つしか存在しないこともあります。

平成29年度午後Ⅱ問2 を参考にします。

【概念データモデル】

1つだけのサブタイプ

【関係スキーマ

納入指示(納入番号, 注文番号, 納入指示年月日)
 広域得意先納入指示(納入番号, 納入元物流センタ拠点コード)

"納入指示" のインスタンスのうち、"広域得意先納入指示" だけがサブタイプ化されていることから、不完全なサブタイプといえます。

スーパータイプの主キーとサブタイプの候補キーで一致する

スーパータイプとサブタイプの主キーで一致するのではなく、スーパータイプの主キーとサブタイプの候補キーで一致することもあります。

平成28年度午後Ⅱ問2 を参考にします。

【概念データモデル】

スーパータイプの主キーとサブタイプの候補キーで一致する

【関係スキーマ

品目(品目番号, 品目名, 品種番号, 品目区分)
 製品(製品番号, 品目番号, 標準保証期間)
 部材(部材番号, 品目番号, 計量単位)

"品目" の主キーは "品目番号" ですが、"製品" と "部材" の主キーは異なります。これは "製品" と "部材" にサロゲートキーを導入したためです。サロゲートキーを導入したことにより、"製品" と "部材" の "品目番号" は主キーでは無く、外部キーかつ候補キーとなりました。

サロゲートキーが導入されても、"品目" と "製品" と "部材" の関連は "品目番号" で示されます。

サブタイプが複数のスーパータイプを持つ

スーパータイプが複数のサブタイプを持つことはよくありますが、その逆にサブタイプが複数のスーパータイプを持つことがあります。

平成25年度午後Ⅱ問2 を参考にします。

【概念データモデル】

サブタイプが複数のスーパータイプを持つ

【関係スキーマ

仕入先(仕入先コード, 仕入先名, 住所, 電話番号)
メーカ(メーカコード, メーカ名, 住所, 電話番号)
 仕入先メーカ(仕入先コード, メーカコード

問題文には『メーカの一部は、仕入れる量が多い商品について、直接仕入れに応じてくれることがある。そのようなメーカを仕入先メーカと呼び、仕入先としても登録している。』とあり、"仕入先メーカ" は「仕入先の一部」であり「メーカの一部」でもあります。このことから、"仕入先メーカ" は "仕入先" と "メーカ" の両方のサブタイプとなります。

「スーパータイプとそのサブタイプ」の両方をスーパータイプに持つサブタイプ

「スーパータイプとそのサブタイプ」の両方をスーパータイプに持つサブタイプが存在します。

平成31年度午後Ⅱ問2 を参考にします。

【概念データモデル】

「スーパータイプとそのサブタイプ」の両方をスーパータイプに持つサブタイプ

【関係スキーマ

品目(品目コード, 品目名, 品目分類コード, 貯蔵区分)
 貯蔵品目(品目コード, 出庫ロットサイズ)
  原材料(品目コード, 原材料分類コード)
  生地材料(品目コード, 生地材料ロットサイズ)
  成型材料(品目コード
  製品(品目コード, 焼成ロットサイズ)

各リレーションの説明を以下に挙げます。

  • 品目には原材料・生地材料・成型材料・製品があり、品目分類で識別しています。
  • 品目が貯蔵対象か否かを貯蔵区分で表します。
  • 品目のうちの貯蔵品目には原材料・生地材料が含まれています。
  • 貯蔵品目には出庫のロットサイズを設定します。

この時、"原材料" と "生地材料" は "品目" かつ "貯蔵品目" であるため、この2つをスーパータイプに持ちます。

ここでの関係スキーマの字下げ表記は問題文の記載に倣いました。字下げからは "成型材料" 及び "製品" まで "貯蔵品目" に含まれているように見えますが、実際には含まれていないことに注意が必要です。
関係スキーマの字下げはサブタイプを見抜くためのヒントになりますが、過信しないことが重要です。

サブタイプを見抜く

サブタイプは関係スキーマの "区分" や "フラグ" といったキーワードで見抜けることがあります。ですが、これらのキーワードが必ずしも登場するとは限りません。『サブタイプはスーパータイプの部分集合である』という点からも見抜きましょう。

平成23年度午後Ⅱ問2 を例に挙げます。

問題文には以下の記載がありました。

(4) 拠点は、Y 社の一部の部門又は一部の取引先からなる在庫管理業務上の組織の呼称であり、拠点コードで一意に識別される。
(5) ある拠点が、Y 社の部門である場合は、Y 社のどの部門に相当するかを識別するために、Y 社の部門コードが与えられている。

『Y 社の部門コードが与えられている』という箇所だけに注目すると、"拠点" の属性に "部門コード" を外部キーとして追加すればよさそうに見えます。ですが『拠点は Y 社の一部の部門』という記載にも注意を払う必要があります。これは "拠点" が "部門" の一部である、つまり "拠点" は "部門" のサブタイプであるとわかります。

この設問の場合は以下の設定がありました。

  • 拠点は "生産現場"・"倉庫"・"部材メーカ" に大別される
  • "生産現場" と "倉庫" は Y 社の部門である
  • "部材メーカ" は取引先である

ここから、概念データモデル・関係スキーマは以下の通りとなりました。

【概念データモデル】

複数のスーパータイプを持つサブタイプ

【関係スキーマ

部門(部門コード, 部門名, 部門種類)
拠点(拠点コード, 拠点区分, 事業所コード)
取引先(取引先コード, 取引先名, 取引先種類)
生産現場生産現場拠点コード, 部門コード, 現場区分)
倉庫(倉庫拠点コード, 部門コード, 倉庫区分)
部材メーカ(部材メーカ拠点コード, 取引先コード, 物流費負担率)

さらに知るために

令和02年データベーススペシャリスト合格教本

令和02年データベーススペシャリスト合格教本

  • 作者:金子 則彦
  • 発売日: 2019/09/14
  • メディア: 単行本(ソフトカバー)

スーパータイプとサブタイプのパターンについて解説しています。パターンが存在する理由であったり、スーパータイプ/サブタイプと他のエンティティとのリレーションシップをどう考えるべきかについても解説しています。

私が内容を確認したのは令和02年版でした。なので、リンクも令和02年版としています。

試験の傾向が大きく変わらない限り、以降の年度でも同様の解説が含まれていると推察できますが、店頭などで確認してからの購入をお勧めします。

まとめ

ここに挙げたように、スーパータイプとサブタイプのパターンは様々です。ルールを暗記して解けるような問題ではありません。

パターンにはデータモデル設計者の意図が込められています。そこにどんな意図が込められ、どうやって利用することを想定しているのかを想像しながら解いてみてはいかがでしょうか。

参考文献

情報処理教科書 データベーススペシャリスト 2020年版

情報処理教科書 データベーススペシャリスト 2020年版

  • 作者:三好 康之
  • 発売日: 2019/09/17
  • メディア: 単行本(ソフトカバー)
用語の定義や問題の解釈を参考にさせていただきました。

更新情報

2020/07/26

タイトルを変更しました。
「実例から学ぶ概念データモデルのスーパータイプとサブタイプ」⇒「概念データモデルのスーパータイプとサブタイプのパターン」

「さらに知るために」を追加しました。

2020/08/18

調査範囲を平成31年度まで広げました。

「「スーパータイプとそのサブタイプ」の両方をスーパータイプに持つサブタイプ」を追加しました。

2020/09/20

「完全/不完全」を追加しました。

その他、説明を数箇所追記しました。

2020/10/15

調査範囲を平成23年度まで広げました。

「サブタイプを見抜く」を追加しました。