在Rich Hickey的演讲"The Value of Values"中,他认为要获得真实的信息,我们不应该用新的事实代替旧的事实,而应该保留时间戳。
例如,如果用户更改了自己的电子邮件地址,我们就不应该使用新地址覆盖旧地址,而是记住"自[timestamp]起,地址为user5@example.com,然后是[timestamp]"。
的user5new@example.com这作为数据完整性原则是有道理的,我相信它是构建Datomic的原则。但是,如果这是真的, Datomic如何处理错误?例如,如果用户输错了他们的电子邮件地址,我们就不想报告它曾经是&# 34; luser5@example.com" ;;我们想忘记那些不正确的信息。
这是怎么做到的?
答案 0 :(得分:7)
要回答您的问题,datomic支持使用新交易进行更正。这与git,svn,cvs等支持更正的方式相同。保留旧的不正确数据仍然很有价值,因为了解(以及何时!)您的错误是有价值的。
然而,你确实提出了一个关于时间的重点。你是"收集"两个时间概念:事实真实的时间和记录事实的时间。 Datomic的时间是记录的时间 在许多应用程序中,这些是相同的,但有时(特别是在财务方面)这些非常不同。
Datomic的创建者坚持认为数据库管理的时间是记录时间,而不是其他任何东西。如果您有其他类型的时间需要建模,您可以通知您的事实并在其上设置时间,或者您可以将其他类型的时间添加到交易记录中。
有关Datomic google群组this thread (and others) about the two different kinds of time的更详细讨论。在使用应用程序域时间概念(即,不是"时间)时,该线程上有一些尝试用于恢复数据组记录时间函数的一些便利(例如对tx日志的快速排序访问)。记录")。值得一看。
答案 1 :(得分:1)
目前,没有办法做到这一点。最接近的是使用切除清除/删除旧数据。 http://blog.datomic.com/2013/05/excision.html。即使使用切除,也会记录您删除的内容(例如“属性X的值被删除”)。
编辑:有一个有用的评论与Git有关。为了扩展类比,Git 确实允许您执行破坏性更改(即rebase
的任何时候),从而创建完全不同的历史路径。 问题是指使用该回购工作的任何其他人都无法自动协调这些更改。
您可以将Datomic Peers想象成是在数据库中工作的实体。如果您更改了历史记录(即更正的事实),则Transactor,Memcached和引用受影响属性的Peers缓存中的任何缓存Datoms都需要失效。