私は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
+User
にrefs
を削除し、データを取得する必要がある関係を見つけるにはviaAssociations
?つまり、association/related-ents
が含まれているすべてのアソシエーションを返します。User-Id = foo
2)まったく異なるものです。
効率的なルックアップのために私の質問にはref
がどこに保存されていると思いますか? string
の代わりに使用する別のdb.type
、またはassociation
の別の構成が必要ですか? project/associations
とuser/associations
refs
も必要ですか?
は、任意の洞察力に感謝します。
更新は、もう少し反射した後、私はさまざまなエンティティのrefs
上につまずいと思います。 associations/relatedEnts
を2 Datomic db ids +タグを保持している他のattrsをすべて削除するrefであるとすればいいのですか?これは理想的ですか?
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
あなたは別のプロジェクトは(貢献者、所有者などのための)役割の各属性の指定を検討していましたか? –
はい、私はそれを考慮しました。そのルートは、エンティティ関係の任意の柔軟性を失います。再び考案されましたが、たとえば管理者が来て、ProjectとLocationの関係を追加して宝探しにすることにしました。可能なタグは、「開始点」、「ランチ」、「フィニッシュライン」または任意の数の任意のタグであり、前もって予測することはできません。 – nrako