0

在 Rich Hickey 的演讲“价值的价值”中,他认为要获得真实的信息,我们不应该用新的事实代替旧的事实,而要让两者都带有时间戳。

例如,如果用户更改了他们的电子邮件地址,我们不应该用新地址覆盖旧地址,而是要记住“地址在 [timestamp] 时是 user5@example.com,然后是 user5new@example。 com截至[时间戳]”。

这作为数据完整性原则是有道理的,我相信这是构建 Datomic 的原则。但是,如果这是真的,Datomic 是如何处理错误的呢?例如,如果用户输错了他们的电子邮件地址,我们不想报告它曾经是“luser5@example.com”;我们想忘记那个不正确的信息。

这是怎么做到的?

4

2 回答 2

7

为了回答您的问题,datomic 支持对新事务进行更正。这与 git、svn、cvs 等支持修正的方式相同。保留旧的不正确数据仍然很有价值,因为知道(以及何时!)您不正确是很有价值的。

但是,您确实提出了一个重要的时间问题。你正在“完成”两个时间概念:一个事实是真实的时间和一个事实被记录的时间。Datomic 的时间是一个事实被记录的时间,而不是它有效的时间。在许多应用程序中,它们是相同的,但有时(尤其是在金融领域)它们是非常不同的。

Datomic 的创建者相当坚持数据库管理的时间是记录时间,而不是其他任何东西。如果您需要建模其他类型的时间,您可以具体化您的事实并在其上断言时间,或者您可以将其他类型的时间添加到事务记录中。

在这个线程(和其他线程)上更详细地讨论了 Datomic google group 上两种不同的时间。在该线程上进行了一些尝试,以恢复 datomic 记录时间功能的一些便利性(例如,对 tx 日志的快速排序访问),同时使用应用程序域时间概念(即,不是“记录时间”)。值得一看。

于 2013-10-29T14:04:19.147 回答
1

目前,没有办法做到这一点。最接近的是使用切除清除/删除数据。http://blog.datomic.com/2013/05/excision.html。即使有删除,也会有您删除的内容的记录(例如“属性 X 的值被删除”)。

编辑:有一个与 Git 相关的有用评论。为了扩展类比,Git确实允许您执行破坏性更改(即任何时候rebase),这会创建一个完全不同的历史路径。问题是任何其他使用该存储库的人都无法自动协调这些更改。

你可以想象你的 Datomic Peers 是那些在你的数据库之外工作的实体。如果您更改了历史记录(即更正的事实),则 Transactor、Memcached 和引用受影响属性的 Peers 缓存中的任何缓存 Datom 都需要失效。

于 2013-10-29T13:48:57.117 回答