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.
轻松从销售中检索国家/地区信息
让我入门的非常基本的问题。假设我有一个按国家/地区分类的销售数据库:
[{: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.
轻松从销售中检索国家/地区信息