2016-10-20 9 views
2

私はthis SO questionで会話を拡張し、実装の点でより詳細な情報を得ることを望んでいました。Datomicでの注釈付きの関係

私の要件には、リレーションシップにタグを定義することが含まれています。その数は任意であり、関係するエンティティは任意であり、関係するエンティティはコンティンジェントではありません(エンティティのComponent)。

たとえば、Userは、多くの場合、Projectsを持つことができます。 Projectは、多くの場合、Usersを持つことができます。

管理者は、リレーションごとに関連するユーザーに割り当てる任意の数のタグを作成します。 Owner,Contributor,VIPなど、User~Projectなど。私はthis answerの理解何から

、シンプルrefは不十分であると私は、追加のエンティティを作成するthis-

関連のあるようなものが必要になりますProject属性

:db/ident    :project/associations 
:db/valueType   :db.type/ref 
:db/cardinality  :db.cardinality/many 

関連のあるUser属性

:db/ident    :user/associations 
:db/valueType   :db.type/ref 
:db/cardinality  :db.cardinality/many 

適合性Association属性

:db/ident    :association/related-ents 
:db/valueType   :db.type/string 
:db/cardinality  :db.cardinality/many 

:db/ident    :association/assoc-id 
:db/valueType   :db.type/string 
:db/cardinality  :db.cardinality/one 

:db/ident    :association/tag 
:db/valueType   :db.type/ref 
:db/cardinality  :db.cardinality/one 

関連のあるTag属性

:db/ident    :tag/name 
:db/valueType   :db.type/string 
:db/cardinality  :db.cardinality/one 

これは私の知る限り得ているようです。私はassociationエンティティを慣用的な方法で構築する方法については明確ではない。

Usersを含むがこれらに限定されない特定のProjectに関連する関係を見つけるだけでなく、relationship tag = Contributor、I

  • 1)Project + Userrefsを削除し、データを取得する必要がある関係を見つけるにはvia Associations?つまり、association/related-entsが含まれているすべてのアソシエーションを返します。User-Id = foo

  • 2)まったく異なるものです。

効率的なルックアップのために私の質問にはrefがどこに保存されていると思いますか? stringの代わりに使用する別のdb.type、またはassociationの別の構成が必要ですか? project/associationsuser/associationsrefsも必要ですか?

は、任意の洞察力に感謝します。


更新は、もう少し反射した後、私はさまざまなエンティティのrefs上につまずいと思います。 associations/relatedEntsを2 Datomic db ids +タグを保持している他のattrsをすべて削除するrefであるとすればいいのですか?これは理想的ですか?

次の2つの他のエンティティ(Userとあなたの例ではProject)との間の関係を表現するエンティティを定義しているとき、私はその具体化の関係エンティティ(あなたAssociation)からリンケージを作るお勧めします
:db/ident    :association/relatedEnts 
:db/valueType   :db.type/ref 
:db/cardinality  :db.cardinality/many 

:db/ident    :association/tag 
:db/valueType   :db.type/ref 
:db/cardinality  :db.cardinality/one 
+0

あなたは別のプロジェクトは(貢献者、所有者などのための)役割の各属性の指定を検討していましたか? –

+0

はい、私はそれを考慮しました。そのルートは、エンティティ関係の任意の柔軟性を失います。再び考案されましたが、たとえば管理者が来て、ProjectとLocationの関係を追加して宝探しにすることにしました。可能なタグは、「開始点」、「ランチ」、「フィニッシュライン」または任意の数の任意のタグであり、前もって予測することはできません。 – nrako

答えて

1

Datomic参照を介して他のエンティティ。これは、例えば複合文字列を解析することなく、一方から他方へナビゲートする能力を保持する。

また、多くのUsersProjectsの間の関係を表す単一のAssociationエンティティのみを持つことを検討していることがわかります。このアプローチは機能しますが、モデル化しているすべての関係に対してAssociationエンティティを作成すると、柔軟性とカスタマイズ可能性が大幅に向上します。これをグラフモデリングの問題として考える場合は、UserProjectエンティティがグラフのノードであり、2つのノード間の各エッジに「エッジエンティティ」を作成します。それらの「エッジエンティティ」のそれぞれは、に1つ、Projectに1つ、2つの参照属性を持つAssociationのインスタンスで表されます。また、Associationには任意の追加属性を任意の数だけ追加することができます。これにより、データを関係に直接添付することができます(つまり、タグ属性や関係について表現したいデータなど)。

ベスト、 マーシャル

+0

返事をありがとう。私はあなたが言っていることを理解していると思います。 Datomicスキーマの詳細であなたの答えを更新できますか? – nrako