12

たぶん私はまだSQLを考えていますが、単純なブログのdatomicスキーマを書くのに問題があります。:db/cardinality属性とその意味がよくわかりません。

このタイプのシステムに関して、これらの関係をどのようにモデル化するか

  • システムは複数のユーザーをサポートします
  • 各ユーザーには多くのカテゴリがあります
  • 各ユーザーは多くの記事を持っている可能性があります
  • 各カテゴリには多くのユーザーがいる可能性があります
  • 各カテゴリには多くの記事が含まれる場合があります
  • 各記事には多くのコメントがあります
  • 各コメントには1人のユーザーがいます
4

2 に答える 2

24

次の図を見て、 https://gist.github.com/a2ndrade/5651419で完全なコード サンプル (スキーマ、サンプル データ、およびクエリ) を読んでください。Datomic でデータをモデル化する方法を理解するのに役立ちます。

Datomic スキーマ: ブログ

クエリ

Datomic の関係は双方向であり、単純な Datalog クエリを使用して残りの情報を取得できるため、一部の関係は明示的にモデル化されていないことに注意してください。たとえば、クエリは次のとおりです。

(d/q '[:find ?cid ?c
   :in $ ?u
   :where
   [?uid :user/username ?u]
   [?aid :article/category ?cid]
   [?aid :article/author ?uid]
   [?cid :category/name ?c]]
 (d/db conn) "john.smith")

ユーザー ("john.smith") が記事を書いたすべてのカテゴリ ID とその名前を検索します。

封じ込め関係

重要なモデル化の決定は、記事がコメントを指し、関係をマークすること:db/isComponentです。これは、コメントが単独で存在するのではなく、記事の一部として存在する必要があるためです。記事自体が撤回された場合、Datomic は記事に関連付けられたすべてのコメントを必ず撤回します。

ビジネスルールの施行

アプリケーション固有の一貫性ルール (たとえば、記事とコメントには作成者が必要、コメントは特定の長さでなければならないなど) を適用する場合は、データベース関数を使用する必要があります。それらはトランザクター内で実行され、アトミックに任意の制約を強制し、それらに準拠しないトランザクションを中止することができます。

于 2013-05-26T02:01:26.153 に答える
5

最初に、エンティティの種類 (この場合はユーザーとコメント) 間に 1 対多の関係がある単純なケースを見てみましょう。

user ---- * comment

:db.type/ref型の: comment/userなどの属性を使用して、各コメントが正確に 1 人のユーザーを指すようにすることで、これをモデル化することを選択できます。

コメントには最大で 1 人のユーザーが含まれる可能性があるため、これは自然なモデルです。カーディナリティは最大でも 1 であると言います。値の数 (この場合はユーザーへの参照) は 1 を超えることはできません。

これは:db/cardinality :db.cardinality/oneを使用してスキーマで指定できます。これは実際にはデフォルトであるため、明示的に記述する必要はありません。

Datomic エンティティは型指定されていないため、実際のカーディナリティ 1を強制することはできないことに注意してください。どの属性も存在しない可能性があります。(エンティティは、実際の属性を通じて暗黙の型を持ちます。これらの保守と解釈は完全にアプリケーション次第です)

一方、コメントを複数のユーザーに適用したい場合は、多対多の関係があります。

user * ---- * comment

これは、属性:comment/user:db/cardinality :db.cardinality/manyにすることで実現できます。コメントからユーザーへの複数の参照を許可することにより。

このようにして、各ユーザーを複数のコメントで参照したり、各コメントで複数のユーザーを参照したりできます。

コメントではなくユーザーに多くのカーディナリティの参照を持たせることも同様に選択できます。

これがあなたが始めるのを助けるのに十分明確であることを願っています:)

于 2013-02-12T15:39:11.483 に答える