ジョン・サンダースが推薦した本は、私が今まで読んだ中で最高の本の 1 つです。また、すべての ORM に関する質問は、ほとんどの場合、それを読むことで解決できます。
ただし、質問に直接答えるために(そしてモデルの有効性に関する質問を回避するために)、それをそのまま制約する2つの明白な方法があります。
実際にキャプチャしたいものに応じて、サブセット制約または等式制約のいずれかを使用できます。
役割間に平等制約 (Right) を割り当てることで、生きているタイプのモノには生年月日があり、生年月日を持つモノは生きているタイプであることを概念的に要求する制約を生成できます。
ロール間にサブセット制約 (左) を割り当てることで、DateOfBirth を持つ Type の Thing は生きている Type でなければならないようにモデルを制約できます。これは、等式制約とは異なり、物事が生きているタイプであることを許可しますが、生年月日はありません。
追加機能:
これらのタイプのサブセットおよび等価制約を作成するには、「結合パス」と呼ばれるものを使用する必要があります。結合パスを使用すると、制約の両側で複数のロールにまたがる結合サブセット制約と結合等価制約を作成できます。 結合パスの例は、明白でわかりやすい場合があります。しかし、時には少し圧倒されて複雑になることもあります。また、ここで説明されているように、NORMA は結合パスの作成をサポートしていますが、等式、サブセット、および除外制約では、それらの動詞化は 100% 完全ではありません。. これは、モデルの正確性を概念的に検証する方が簡単であるため、現時点でサブセットを使用する方が簡単な理由の 1 つでもあります。
サブセット、等式、または除外制約の役割を割り当てるときに NORMA で結合パスを作成するには、まずパスの一部であるすべての役割を 1 回のクリックで割り当て、次にダブルクリックして次のパスに移動します。制約がパスを結合できる場合、その制約に含まれるロールには [#] ではなく [#.#] というラベルが付けられます。したがって、制約を作成するとき、ロール [1.1]&[1.2] はロール [2.1]/[2.1] のサブセット/等しいと言えます。各役割で役割を果たすファクトも一致する必要があることに注意してください。したがって、彼は NORMA から言語化され
ます。あるモノはあるタイプであり、そのモノはあるタイプです。そのタイプは生きています。これは、次のように表現する方が適切です。そのタイプは生きています。
ただし、これを制限できる 3 番目の (そして望ましい) 方法があります。生きているものと生きていないものは大きく異なるため、おそらくそれらを同じテーブルにマッピングしたくないでしょう。ここでは、Type ファクトを OrganicTypes と NonOrganicTypes の 2 つのサブタイプに分割します。2 つのサブタイプ間の Exclusive Or 制約は、すべてのタイプが Organic または NonOrganic のいずれかであることを示しています。注は、タイプが属するグループを決定するために使用する導出規則を示しています。そこから、[Thing is of Type] ロールを [LivingThing is of OrganicType] に再定義します。そして、OrganicThings は定義上生命が可能であるため、DOB/is Living の制約がモデルに組み込まれています。