このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

続報・カーディナリティ(多項関係、関係の属性も)

カーディナリティ〈多重度〉の“カラスの足”記法が分からない」において、関係のカーディナリティ〈多重度〉の説明が(僕が見た少数の事例では)曖昧・意味不明で困ったもんだ、という話をしました。

その後、ER diagrams vs. EER diagrams: What’s the difference? という解説記事に次の図を見つけました。$`\newcommand{\mrm}[1]{\mathrm{#1}}`$

Manyが実はAny〈任意〉なのだと解釈すれば、これらの記号は、関係〈非決定性関数〉 $`R:A \to B`$ に関する次の条件〈制約〉を表現すると思われます。

  1. One : $`\forall x\in A.\, \mrm{card}(R(x)) = 1`$
  2. Many : $`\forall x\in A.\, 0 \le \mrm{card}(R(x))`$ (無条件)
  3. One and only one : $`\forall x\in A.\, \mrm{card}(R(x)) = 1`$
  4. Zero or one : $`\forall x\in A.\, 0 \le \mrm{card}(R(x)) \le 1`$
  5. One or many : $`\forall x\in A.\, 1 \le \mrm{card}(R(x))`$
  6. Zero or many : $`\forall x\in A.\, 0 \le \mrm{card}(R(x))`$ (無条件)

この解釈(僕の憶測)だと:

  • One と One and only one は同じこと。
  • Many と Zero or many は同じこと。
  • One or many は、One or more-than-one〈1 または 1 を超える多数〉 のこと。
  • したがって、Many〈任意 無条件〉、Zero or one〈単葉〉、One or many〈全域〉、One〈一意的〉だけで十分。One and only one、Zero or many は不要。Many も無印で済むから必須ではない。

僕の憶測が間違っているなら、正しい定義が知りたい

さて、The (Extended) Entity-Relationship Model というスライド(おそらく講義資料)では次の図を見つけました。

ひし形は関係〈関連〉を表します*1。二項関係だけではなくて多項関係を許しているようです。Meetsは、Course、Room、Dayのあいだの三項関係です。三項関係でもカーディナリティ制約を付けています。上の図のカーディナリティ記法は、許される最小値と最大値のペアなので分かりやすいです。書き方は分かりやすいけど、どう解釈するの?

おそらく(また憶測ですが)、三項関係を二項関係〈非決定性関数〉とみなしてからカーディナリティ制約を解釈するのでしょう。三項関係 $`\text{Meets}`$ から次の3つの二項関係〈非決定性関数〉を作ります。

$`\quad \text{Meets1} : \text{Room} \times \text{Day} \to \text{Course}\\
\quad \text{Meets2} : \text{Course}\times \text{Day} \to \text{Room} \\
\quad \text{Meets3} : \text{Course}\times \text{Room} \to \text{Day}
`$

カーディナリティ制約は次のようになります(たぶん)。N は任意の自然数なので制約はかかりません。

  1. $`\forall (r, d)\in \text{Room} \times \text{Day}.\, 3 \le \mrm{card}(\text{Meets1}( (r, d) ) ) \le 3 `$
  2. $`\forall (c, d)\in \text{Course} \times \text{Day}.\, 0 \le \mrm{card}(\text{Meets2}( (c, d) ) ) \le 40`$
  3. $`\forall (c, r)\in \text{Course} \times \text{Room}.\, 0 \le \mrm{card}(\text{Meets3}( (c, r) ) )`$ (無条件)

二項関係でもカーディナリティ制約の解釈が難しいのに、雰囲気的な説明だけで三項関係のカーディナリティ制約を解釈するのは無理があるのでは? そもそも、三項以上の多項関係って要る? 僕は要らないと思うけど。

同じスライド資料から別な図を挙げます。

これは、試験〈EXAM〉を、学生〈STUDENT〉と科目〈COURSE〉のあいだの関係〈関連〉と捉えています。その捉え方が疑問だけど、それはまーいいとして、試験〈EXAM〉に属性が付いていることに注目します。点数〈Mark〉と日付〈Date〉は試験〈EXAM〉という関係に対する属性です。

この例は、色々とモヤモヤするので、もっと単純な“関係に対する属性”の例を出すと; 人〈PERSON〉と人〈PERSON〉との関係として友人〈FRIEND〉であるという関係を考えます。友人関係にいつから〈Since〉という属性を付けます。「山田太郎と鈴木明は2013年以来の友人である」は次のように書けます。

$`\quad \text{FRIEND} \subseteq \text{PERSON}\times \text{PERSON}\\
\quad (\text{山田太郎}, \text{鈴木明}) \in \text{FRIEND} \:\text{Since } \mrm{Year}2013`$

関係に対する属性もあれば便利そうですが、ほんとうに要る? 僕は要らないと思うけど。


“三項以上の多項関係”も“関係に対する属性”も要らないと書きました。「いや、要るだろう」という意見もあるでしょうし、「なんで要らないんだよ?」と疑問も感じるでしょう。ちゃんと説明しようとすると長くなるんで、その話はまたいずれ(って、いつになるかはわからん)。

*1:{Extended | Enhanced} Entity-Relationship Model ではひし形を使うことが多いようです。