datomic / datascript 初学者 - 我们可以有多个模式吗

datomic / datascript beginner - can we have multiple schemas

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

[{: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"}}
              ])

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

(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}

             })

有没有更好的方法在模式中定义 country/code 和 sales/country-code 是相同的“键”?

谢谢,

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

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

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

的引用

我建议您改为将 :sales/country 设为 Datomic 引用:

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

然后 link 在事务中使用查找 ref:

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

这将确保在交易期间存在具有此代码的国家/地区。您还将获得一些好处,例如使用 entities/pull.

轻松从销售中检索国家/地区信息