7

Datomic Sc​​hema doco-では、というスキーマ属性について言及していますdb/isComponent。これは、 によって定義された関係を参照しているよう:db.type/refです。

db/isComponent、シアトルの例では使用されていません。:db.type/refDatomic のリレーションシップは (リレーショナル データベースの外部キー依存関係の概念を使用するために) 「強制」されていないと言っても過言ではありません - で設定しない限りはdb/isComponent?

4

2 に答える 2

13

封じ込め関係 ( :db.type/ref+ :db/isComponent)

:db/isComponent包含関係、つまり UML からの構成関係を指定するために使用されます。「 AにはBがある」というような関係と考えることができます。シンプルなブログの一部をモデル化するのは明確な例です:

記事コメント

Datomic では、:db/isComponent上記の Article-Comments 関係の一部として属性を使用すると、記事を撤回すると、そのコメントもすべて撤回されます。完全なコード サンプルについては、Datomic: 包含関係、つまり db/isComponent gistを参照してください。

Datomicには、間違った種類のエンティティを:db.type/ref属性に追加することを防ぐものは何もないことに注意してください。上記のサンプルでは、​​Datomic を使用すると、特に気にせずに (コメントではなく) 「作成者」エンティティへの参照を追加できます。ここで、外部キー制約の出番です。

外部キー制約 ( :db.type/ref+ データベース関数)

Datomic は:db.type/ref属性を使用して関係を定義しますが、それらについて実際には何も強制しません。任意の外部キー制約を使用するには、代わりにデータベース関数を使用する必要があります。

あなたが言及したシアトルのデータベースでは、:community/orgtype属性はいくつかの許可された列挙値 ( :community.orgtype/*) のみを参照することになっていますが、実際には実行時に強制はありません:

ここに画像の説明を入力

Datomic で任意の外部キー制約を実装する方法を示すために、間違った列挙値が属性add-fkに関連付けられるのを防ぐデータベース関数 ( と呼ばれる) を作成しました。:community/orgtype

完全なコード サンプルについては、Datomic: データベース関数と外部キー制約の要旨を参照してください。たとえば、add-fkデータベース関数の動作を以下に示します。

 ;; will succeed
 [[:db/add #db/id [:db.part/user] :community/name "15th Ave Community"]
  [:add-fk #db/id [:db.part/user] :community/orgtype :community.orgtype/personal]])

 ;; will fail
 [[:db/add #db/id [:db.part/user] :community/name "15th Ave Community"]
  [:add-fk #db/id [:db.part/user] :community/orgtype :community.type/email-list]])
 ;; java.lang.Exception: :community.type/email-list is not one of 
 ;; [[:community.orgtype/community], [:community.orgtype/commercial], 
 ;; [:community.orgtype/personal], [:community.orgtype/nonprofit]]
于 2013-06-16T20:05:49.633 に答える
3

いいえ。Datomic では、db/isComposite は、OOP/UML の意味での(集計ではなく)構成を指します。

db/isComposite を true に設定すると、エンティティを撤回すると、すべてのサブコンポーネントも撤回されます。エンティティをタッチすると、そのすべてのサブコンポーネント エンティティが再帰的にタッチされます。

eコマースの世界からの2つの異なる関係の例を考えてみましょう:

1)顧客 ---- UserPreferences

通常、これはコンポジションです。プリファレンス エンティティの有効期間は、Customer エンティティの有効期間に依存します。Datomic では、Customer の userPreferences ref で db/isComposite 属性を true に設定する必要があります。

2)顧客 ---- OrderItem

通常、これは集計です。OrderItem は、Customer が削除された場合でも存在できます。これは、Datomic の ref のデフォルトのタイプです。

リレーショナル モデルは両方の依存関係を外部キーとして実装するため、表現に関しては次のようになります。はい、db/isComponent は RDBMS で CASCADE アクションを使用した参照制約 (FOREIGN KEY) として表現できますが、概念的には同等ではありません。

于 2013-03-23T15:51:52.227 に答える