马丁·福勒正在讨论事件采购
https://martinfowler.com/eaaDev/EventSourcing.html
e.g。将数据存储为一组事件。
现在一个例子是一个帐户。您创建余额为0的帐户。
然后你把10美元。你提取5美元。你再投入100美元。现在余额是105美元,但你不能存储105美元。你存储的是
+10
-5
+100
作为数据库中的一系列事件。
现在,如果我想,我可以说"撤消最后两个步骤。"然后我只删除数据库中的最后2个更改 - >帐户为10
现在:你怎么能用字符串做到这一点?
首先说帐户名是空字符串。然后
dirk dietmeier
然后hans hansenmann
然后foo bar
如何将这些数据作为一组更改来捕获?虽然让它可以逆转,例如事件需要能够扭转自己。例如。你可以说删除所有内容然后放foo bar
但是没有更好的解决方案吗?
有像svn或git这样的算法吗?一些编码(十六进制,二进制?)?
答案 0 :(得分:1)
现在,如果我想,我可以说"撤消最后两个步骤。"然后我就删除了 数据库中的最后2个更改 - >帐号是10
如果您想保留历史记录,则不是。在生产事件源应用程序中,我会发出补偿事件。例如。撤消X事件的新事件Y.与此类似的git是git revert
。
现在:你怎么能用字符串做到这一点?
取决于您的应用。
如果您要跟踪对代码的更改,那么就如何表达两个文件之间的差异进行一些研究是有意义的,这样您以后就可以恢复。从这个意义上讲,您的事件类似于git commit 。我建议你看一下diff linux命令http://linuxcommand.org/man_pages/diff1.html并查看源代码,或者如何实现它。
如果您的活动类似于 CustomerFirstNameChanged
,那么做差异很有意义。您始终希望恢复到之前的状态,例如John
或Rick
。
对于诸如ArticleRedrafted
之类的事件,数字2也是有意义的,您可以返回到之前的版本。当我们使用git revert
时,内容编辑看不到修改,因为我们看到git提交...他们将其视为可以返回的时间点。
答案 1 :(得分:0)
有许多方法可以将一个字符串的变化表示为另一个字符串作为可逆操作。这实际上取决于要求。
我不希望源控制系统中的划分必然满足您在上面概述的一般需求。例如,git用于对存储文件进行分区(仅在生成包时才这样做)的目的是节省空间。较旧版本的对象可以作为新版本的增量存储,但是从来没有必要通过旧版本的delta重建较新版本 - 它是专门存储的,以便可以快速访问(无需结合三角洲)。因此,从git的角度来看,存储用于三角形的足够信息将被用作双向转换。
您可以考虑diff
如何代表更改,而不是查看包增量。这比你想要的更加面向行。如果您有已编辑的文件,则可以将编辑表示为
d37
- Line 37 used to contain this text, but it was removed
a42
+ We added this text on line 42
c99
- Line 99 used to have this text
+ Line 99 now has this text
你可以做一个面向角色的版本。假设您为&#34添加运算符;在偏移"添加字符,"删除偏移"处的字符,以及"更改偏移"处的字符。您要么必须小心转义分隔符,要么使用显式长度而不是简单地分隔字符串。您还应该考虑每次编辑可能会更改后续编辑的偏移量。技术上的前映像偏移具有您需要的所有信息,但如果您还存储了图像后偏移,则补丁的反转更直观。
所以给出
well, here is the original string
你可能有像
这样的可逆增量0/0d6:well, 14/8c12:the original1:a33/16a11: with edits
产生
here is a string with edits
当然,计算最正确的"补丁可能并不容易。
0/0c33:well, here is the original string27:here is a string with edits
同样有效,但退化为面向行的方法。
但这只是一个例子;就像我说的,你可以定义任意数量的方式,具体取决于要求。