首页 > 解决方案 > 元组与复合元组与 Datomic 中的组件

问题描述

元组复合元组组件之间有什么区别?

我发现这是模式中最难理解的方面之一。我发现文档(总体上非常好)在从头开始解释这一点时不够清楚,也许是因为缺乏示例,并且还没有找到涵盖它的讨论,无论是最新的还是其他的。

这是我能够找到的(可能是错误的):

标签: datomic

解决方案


Datomic 中的元组添加了更灵活的唯一性约束,并允许您预先计算最佳连接,仅此而已。

来自 Datomic 博客(发行说明):

您可以使用元组在域实体上创建多属性唯一键。您还可以使用元组来优化查询,否则这些查询必须连接两个或多个高人口属性。

Datomic 有 3 种元组的原因是您需要同质的可变长度元组来定义异构的固定长度元组,然后您需要定义复合元组。

复合元组只是方便。

虽然元组听起来像是你可能想要的东西,但你失去了一些灵活性。例如,如果您没有要查询的基础属性,则不能使用 VAET 索引(假设其中有 a :db.type/ref)。这就是为什么我认为元组是最重要的性能特性,你应该坚持只使用复合元组,而不是打扰其他类型的元组。

例如,如果您需要将元组属性放在复合元组中,但如果您的所有元组都是复合元组,您可以这样做,因为它只是一组不同的属性。

您不应将元组视为架构的一部分。相反,将它们视为您移植到顶部以促进某些事情的东西。


关于组件,我会给你一个 JSON 文档的类比。引用该文档中结构的属性是组件。不应该共享组件,因为它们的行为方式不应该共享(不是你不能)。因为当你收回一个实体时,它也会收回它所引用的所有组件。这就是你不共享组件的原因。回到 JSON 文档,该文档中的任何对象或数组都是根的组件。当然,组件可以有组件。您可以将这样的结构视为合理的数据单元,但它是一个复杂得多的结构。


推荐阅读