我目前正在尝试了解如何构建事件存储的内部结构。到目前为止我得到了什么:
aggregateId
(可能是GUID)和aggregateVersion
(这是一个整数,仅表示影响此聚合的最后一个事件的编号) eventId
(同样是GUID),aggregateId
(事件所属),payload
和version
(这只是一个描述事件顺序的整数。)到目前为止这是正确的吗? 应该使用整数来排序事件吗?或者他们应该根据时间戳订购?每个有什么好处?有什么缺点?
答案 0 :(得分:10)
我建议您查看Jonathan Oliver's EventStore以供参考。
在SQL持久性版本中,只有一个表。您可以轻松地在没有聚合表的情况下生存,并将aggregateId存储在事件表中。可以使用max()查询检索最新版本。
除此之外,我认为你应该考虑在事件表中设置标题,因为总有一些有趣的元数据你不想存储在事件中。
而且,我认为你应该在事件表中添加一个日期列。
最后,您可能想要某种标志,指出事件是否已下游调度。此添加使您可以在一个线程或进程中编写,并在另一个线程或进程中进行分派
Aaand那里,我有点建议Jonathans EventStore的结构。
答案 1 :(得分:4)
看看http://geteventstore.com/ - Greg Young的这个版本也有source available for your perusal [with a BSD 3-clause license on GitHub]。
答案 2 :(得分:4)
我不能为Mikael的回答增加太多。
这里还有一件事作为参考:几年前,Greg Young写下了他对事件存储实现的看法。该文件可在http://cqrs.wordpress.com/documents/building-event-storage/
找到虽然我相信他的方法也同时发展了。
答案 3 :(得分:2)
聚合与cqrs有关,但不直接与事件存储有关。 你有两个集合,但这些是事件和快照。 有关详细信息,请查看: https://github.com/jamuhl/nodeEventStore