2016-10-20 30 views
2

我希望能延長關於this SO question的對話並獲得更多關於實現的細節。Datomic中的註釋關係

我的要求包括允許管理員定義關係上的標籤,其數量是任意的,涉及的實體是任意的,並且涉及的實體不是偶然的(即不是實體的Component)。

對於一個人爲的例子,User可以有很多Projects。 A Project可以有許多Users

管理員可以創建任意數量的標籤以分配給相關用戶的每個關係,例如Owner,Contributor,VIP等,對於UserProject

據我瞭解的this answer,一個簡單的ref是不夠的,我需要創建一個額外的實體,像這個 -

相關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 

這是據我已經得到了。我不清楚如何以慣用的Datomic方式構造association實體。

要找到一個給定的Project關聯關係,包括但不限於Users,以及找關係,其中relationship tag = Contributor,我應該

  • 1)刪除該refsProject + User和檢索數據通過Associations?即返回所有協會,其中association/related-ents包含User-Id = foo

  • 2)完全不同的東西。

我想我的問題歸結爲我在哪裏存儲ref高效查找?是否應該使用不同的db.type而不是string,或者需要使用association的不同構造?甚至需要project/associationsuser/associationsrefs

感謝任何見解。

更新


多一點反思之後,我覺得我絆倒在refs上的各種實體。我想知道我是否可以簡單地擁有一個associations/relatedEnts,它本身就是一個擁有2個Datomic db ids +標記並放棄所有其他列出的attrs的ref。這是理想嗎?

: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

是的,我確實考慮過。這條路線失去了實體關係的任意靈活性。再次做作,但例如,管理員出現並決定添加項目和位置之間的關係,使其成爲尋寶。可能的標籤是'起點','午餐','終點線'或任何數量的無法預先預測的任意標籤。 – nrako

回答

1

當你定義一個實體來代表其他兩個實體(一User並在例如Project)之間的關係,我建議你從物化關係的實體進行聯動(你Association)至其他實體通過Datomic引用。這保留了從一個導航到另一個的能力,而無需例如解析複合字符串。

此外,您的示例向我暗示,您正在考慮僅使用單個Association實體來表示多個UsersProjects之間的關係。儘管此方法可行,但如果您爲建模的每個關係創建Association實體,則您將具有更大的靈活性和自定義潛力。如果您更願意將此視爲圖形建模問題,則您的UserProject實體是圖的節點,並且您爲兩個節點之間的每個邊創建一個「邊實體」。這些'邊緣實體'中的每一個都由Association的實例表示,其具有兩個參考屬性,一個爲User,另一個爲Project。然後,Association也可以具有任意數量的任意附加屬性,從而允許您直接將關聯數據添加到關係中(即您的標籤屬性或任何其他要表示關係的數據)。

最佳, 馬歇爾

+0

感謝您的回覆。我想我明白你在說什麼。你能用Datomic模式詳細信息更新答案嗎? – nrako