0

让我开始的非常基本的问题。假设我有一个按国家/地区划分的销售数据库:

[{:sales/country "CN" :sales/amount 1000 :sales/account "XYZ"} ...]

我还想列出有关每个国家/地区的事实清单,例如:

[{:country/short-name "CN" :country/long-name "China" ...}]

然后进行“列出在中国发生的所有销售(使用长名称)”类型的查询。

那是一个数据库吗?我如何明确有两种不同的模式?我是否先处理第一个模式,然后处理销售数据,然后再处理国家模式和数据?

编辑:抱歉我的问题不清楚。这是现场示例:

(d/transact! conn
             [{:country/code "BR" :country/name "Brazil"}
              {:country/code "CN" :country/name "China"}])

(d/transact! conn
             [{:sales/country "CN" :sales/amount 1000 :sales/account "XYZ"}
              {:sales/country "CN" :sales/amount 1000 :sales/account "AAA"}
              {:sales/country "BR" :sales/amount 1000 :sales/account "BBB"}}
              ])

我能够运行查询来加入表并获得我想要的结果。我不明白定义我的模式的最佳实践是什么。它只是其中的一个模式还是两个模式,每个表一个模式。我可以这样做:

(def schema {:country/code {:db/valueType :db.type/string :db/unique :db.unique/identity}
             :country/name {:db/valueType :db.type/string}
             :sales/account {:db/valueType :db.type/string :db/unique :db.unique/identity}
             :sales/country-code {:db/valueType :db.type/string}
             :sales/amount {:db/valueType :db.type/integer}

             })

有没有更好的方法在模式中定义国家/代码和销售/国家代码是相同的“键”?

谢谢,

4

1 回答 1

1

您只能有 1 个架构,但这应该足够了。在关键字中使用命名空间来区分不同的“域”(:country/*有关国家:sales/*的信息,有关销售的信息)。

Datomic 更像是一个列存储,因此任何实体都可以有任何属性,您甚至可以在单个属性上混合不同的“表”(我不推荐这样做,但这是可能的)。

您使用的:country/code是 Datomic 所说的“外部 id”。这也是一个很好的做法,尽管没有办法指定它:sales/country是对:country/code.

我建议你做的是做:sales/country一个 Datomic 参考:

:sales/country-code {:db/valueType :db.type/ref}

然后使用查找参考在事务中链接到它:

@(d/transact! conn [{:sales/country [:country/code "CN"] :sales/amount 1000 :sales/account "XYZ"})

这将确保具有此代码的国家/地区在交易期间存在。您还将获得好处,例如使用实体/拉取轻松从销售中检索国家/地区信息。

于 2021-11-25T10:42:13.110 回答