datomic - 元组与复合元组与 Datomic 中的组件
问题描述
元组,复合元组和组件之间有什么区别?
我发现这是模式中最难理解的方面之一。我发现文档(总体上非常好)在从头开始解释这一点时不够清楚,也许是因为缺乏示例,并且还没有找到涵盖它的讨论,无论是最新的还是其他的。
这是我能够找到的(可能是错误的):
元组看起来有点像 postgres 中的数组。
复合元组似乎可以添加复合键,即跨多个属性的唯一性。
组件是您定义类似文档的结构的方式,主要是为了获得级联删除。
解决方案
Datomic 中的元组添加了更灵活的唯一性约束,并允许您预先计算最佳连接,仅此而已。
来自 Datomic 博客(发行说明):
您可以使用元组在域实体上创建多属性唯一键。您还可以使用元组来优化查询,否则这些查询必须连接两个或多个高人口属性。
Datomic 有 3 种元组的原因是您需要同质的可变长度元组来定义异构的固定长度元组,然后您需要定义复合元组。
复合元组只是方便。
虽然元组听起来像是你可能想要的东西,但你失去了一些灵活性。例如,如果您没有要查询的基础属性,则不能使用 VAET 索引(假设其中有 a :db.type/ref
)。这就是为什么我认为元组是最重要的性能特性,你应该坚持只使用复合元组,而不是打扰其他类型的元组。
例如,如果您需要将元组属性放在复合元组中,但如果您的所有元组都是复合元组,您可以这样做,因为它只是一组不同的属性。
您不应将元组视为架构的一部分。相反,将它们视为您移植到顶部以促进某些事情的东西。
关于组件,我会给你一个 JSON 文档的类比。引用该文档中结构的属性是组件。不应该共享组件,因为它们的行为方式不应该共享(不是你不能)。因为当你收回一个实体时,它也会收回它所引用的所有组件。这就是你不共享组件的原因。回到 JSON 文档,该文档中的任何对象或数组都是根的组件。当然,组件可以有组件。您可以将这样的结构视为合理的数据单元,但它是一个复杂得多的结构。
推荐阅读
- python - 使用来自另一个脚本的数据提供实时绘图
- html - 如何在 TypeScript 中创建矩形列表?
- android - Realm如何判断两个文件是同一个RealmObject?(包装变化)
- c - 意外输出 -scanf 和功能检查
- symfony - getLastAuthenticationError 返回布尔值
- android - 特殊字符编码在 android 的 POST 请求中。如何避免这种情况?
- php - symfony 5,Doctrine Lifecycle Listeners 没有运行
- boolean - 在 Azure 数据工厂中将布尔值转换为 1 和 0
- python - Python为x和y轴上的每个第n个像素更改颜色
- powershell - 在powershell中复制具有匹配文件夹名的文件名