如果我有一个客户实体,并且他们从具有以下事实的时间t1的地址移走:
具有以下事实的新地址和时间t2:
如何避免从t2开始的地址看起来像这样:
我能想到的选项:
我的想法:
其他人对此的想法将不胜感激:)
答案 0 :(得分:0)
您可以将选项2用作组件实体。
https://support.cognitect.com/hc/en-us/articles/215581418-Component-Attributes?mobile_site=true
以下是示例:
;; schema
;;
(d/transact conn [{:db/ident :client/address
:db/cardinality :db.cardinality/one
:db/valueType :db.type/ref
:db/isComponent true}
{:db/ident :address/line1
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}
{:db/ident :address/country
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}])
;; create a new client with address - 1 Main Street
;;
(d/transact conn [{:db/id (d/tempid :db.part/user -1)
:client/address {:address/line1 "1 Main Street"
:address/country "USA"}}])
;; datomic will return you two entity id. One is for :client/address
;; and another one for :address/line1 and :address/country
;;
(d/q '[:find (pull ?e [*])
:where [?e :client/address]]
(d/db conn))
;; => [[{:db/id 17592186045418, :client/address {:db/id 17592186045419, :address/line1 "1 Main Street", :address/country "USA"}}]]
;; now update its client address to 9 Kings Road.
;;
(d/transact conn [{:db/id 17592186045418
:client/address {:address/line1 "9 Kings Road"}}])
;; 17592186045418 will then have a :client/address
;; pointing to a new entity with the new address
;;
(d/q '[:find (pull ?e [*])
:where [?e :client/address]]
(d/db conn))
;; => [[{:db/id 17592186045418, :client/address {:db/id 17592186045421, :address/line1 "9 Kings Road"}}]]