ナレッジ
【連載】概念モデリングを習得しよう:関連クラスがひも付いたリレーションシップ(第12回)

【前回の連載記事はこちら】
【連載】概念モデリングを習得しよう:概念情報モデル(Conceptual Information Model)(第11回)
読者の皆さん、こんにちは。Knowledge & Experience 代表の太田 寛です。
この連載コラムでは概念モデリングの解説を行っています。
今回は、概念インスタンスにおいて関連クラスをひも付けたリレーションシップについて解説します。
関連クラスがひも付いたリレーションシップ
圏Iの解説において、リンクにひも付いた概念インスタンスを紹介しました。このような概念インスタンスのひな型になる概念クラスは、図のようにリレーションシップの線にひも付けて概念クラスを定義することになります。
この概念クラスをひな型とする概念インスタンス一つにつき、必ず、リレーションシップの両端の概念クラスをひな型とする二つの概念インスタンスが存在して、このリレーションシップをひな型とするリンクが張られていなければなりません。そのリンクと関連クラスのインスタンスは一心同体と考えるとよいでしょう。

この場合、リレーションシップの両端の多重度は、1、0..1、1..*、* の4種類だけです。関連クラスが定義されているリレーションシップの場合、その参照を表す特徴値は、関連クラスにひも付けるのが基本です。
関連クラスなしの普通の二項リレーションシップも含めて、概念情報モデルとしてあり得る多重度と、参照を表す特徴値をひも付ける側の概念クラスのパターンを図で紹介しておきます。

リレーションシップの多重度は、意味的な枠組みを構築する上で非常に重要です。多重度こそが、モデル化対象の意味の場の表現を規定するといっても過言ではありません。多重度が変わるとどのくらい意味が変わるのかについては、“商品販売を例にした、概念モデルチュートリアル”に詳しいので読んでみてください。
is-a リレーションシップ
前に挙げた果樹園のリンゴに着目してみます。常識的に考えると、この意味の場におけるリンゴは、時間の経過の中で、
- 栽培中のリンゴ
- 収穫済みのリンゴ
- 試食用のリンゴ
という、ただ一つの概念インスタンスの状態の変化であることは容易に想像が付きます。この状況を概念クラス、リレーションシップでモデル化すると、以下の四つの概念クラスと三つのリレーションシップが存在することになります。

三つのリレーションシップは、リンゴの側は1で、反対側は全て 0..1 という多重度です。この三つのリレーションシップは、リンゴの時間経過に伴う、リンゴの意味的な変化を表すものなので、三つのリレーションシップをひな型とするリンクは、三つのうちのただ一つだけしか同時には存在できません。しかし、図に示したモデルは、三つのリレーションシップのリンクが同時に存在できてしまうので、この意味の場における制約を正しく表せていません。
この制約は、これまで解説してきたリレーションシップの記述方法では表現できないので、新たに“is-a” というタイプのリレーションシップを導入することにします。上の図の三つのリレーションシップを束ねて一つの“is-a”のリレーションシップとし、図では、

と、リンゴ側に白抜きの三角形が付いた線で表現します。
述語化すると、
- “栽培中のリンゴ”は“リンゴ”である
- “収穫済みのリンゴ”は“リンゴ”である
- “納品済みのリンゴ”は“リンゴ”である
“~は~である”は、英語で書けば“is a”というわけです。
概念モデリングでは、“is-a”の白抜き三角の側を“スーパー側”、反対側を“サブ側”と呼んだり、“親側”、“子側”と呼んだりすることもあります。この連載でも、そのような説明が出てきたら、それを思い出してください。
紙やホワイトボードに手書きでモデル図を描く場合は、それほど苦にはなりませんが、Power Point をはじめとする一般的な図を描くアプリケーションを使うときは、いちいち白抜きの三角を描くのは結構面倒くさいので、三角形の側を単なる矢印にした図でも問題ないとします。参考までに、UML 表記で描いたモデル図と簡易表記のモデル図を図表5に示しておきます。

UML 表記で描きたい場合は、UML 表記をサポートするモデリング専用ツールを使うのがお勧めです。
説明では、時間経過による状態変化を例にしましたが、この“is-a”のリレーションシップは、分類を表す状況でも使われます。例えば、果樹園の意味の場において、リンゴの品種ごとに栽培方法や流通方法が異なるのであれば、

のような“is-a”による表現が可能です。あるリンゴが、同時に王林であり、フジであることは物理的にあり得ないので、リンゴの状態変化の時と同様に、is-a のリレーションシップが成り立ちます。
ただし、この例では “リンゴ”という概念クラスに“種別”という特徴値を定義し、そのデータ型を、リンゴの品種を列挙する型とすれば十分な気がしないでもありません。
分類を表明する is-a のリレーションシップを、発電所を例に描いてみます。

まずは図の上のモデル図に着目します。このモデルは、発電所は、
- 水力発電所
- 火力発電所
- 原子力発電所
の3種類しかないことを表明しています。ちょっと考えると、発電方式は、風力や波力、太陽、地熱など他にもさまざまな発電所が思い浮かびますが、それらは一切考えないと主張するモデル図になっています。図表6のリンゴの例でも同様で、リンゴには、フジ、王林、紅玉の3種類しかないことを主張するモデル図です。
概念情報モデルは、モデル化対象の意味の場に存在することを許される、事柄とその性質、および事柄の間の意味のつながりを規定するモデルであるため、このような制約が生じるわけです。そのため、図表5に示した UML 表記のモデル図の、is-a のリレーションシップである R1 には、{complete, disjoint} という添え字を付けています。complete は、サブ側の概念クラスが全て提示されていることを、disjoint は、スーパー側の概念インスタンスについて、サブ側の概念インスタンスがどれか一つだけしか存在しないということです。
このように、is-aは、非常に厳しい制約を課すリレーションシップであり、リンゴの例のように、サンフジ、ジョナゴールドなどさまざまなリンゴの品種を扱いたいなら、図表6の下に示した品種を表す特徴値を持つ概念クラスとして定義した方が妥当でしょう。
参考までにですが、例えば農業に関する法律において、リンゴの場合は、フジ、王林、紅玉だけを対象として何らかの法令があって、三つの品種ごとに細則が規定されている様をモデル化するような場合には、is-a のリレーションシップを使ったモデルの方が妥当と思われます。そのような場合は、サブ側のそれぞれ概念クラスは異なる特徴値のセットや、異なるリレーションシップでつながるようなモデルになるはずです。is-a が有効な表現となるかどうかはケース・バイ・ケースです。
再び、図表7に戻ります。この図の上の発電所のモデル図、一見もっともらしく見えるのですが、本当に正しく現実を記述しているでしょうか。
例えば、原子力発電所を思い浮かべてみると、その事故対策として、水力発電が併設されていたりします。通常は水力発電で作られた電力も顧客に送電されているような場合、これは、果たして、原子力発電所なのか、水力発電所なのか、迷うところです。加えて、一つの原子力発電所に、1号機、2号機、というように、複数の原子力発電機が設置されている方が一般的です。
図表7の下に描いたモデルでは、モデル化対象の意味の場から、発電所と発電機を明確に分けて拾い上げて概念モデル図として、その意味の枠組みを表明しています。この辺りを含めて考えると、こちらのモデル図の方が、現実をより正確に描写していると言えるでしょう。
次回は、概念モデリングにおけるis-aリレーションシップの正しい使い方について解説します。
この記事は面白かったですか?
今後の改善の参考にさせていただきます!