使用事件采购时存储事件

时间:2016-07-28 18:52:33

标签: postgresql oop events domain-driven-design

我一直在阅读有关事件采购的内容,虽然我发现这是一个很自然的方法来解决几个问题,但我并不太了解如何在实践中存储这些事件。

在互联网上搜索一下我发现Vaughn Vernon this article谈到了DDD中聚合存储的简单方法。虽然它并非专门针对事件来源,但他提出了一种使用PostgreSQL存储域事件的方法。

在他的方法中,我们有一个表Events,其中包含一个id和一个JSON data字段。这给了很多自由,因为我们可以存储任何JSON数据,因此我们可以存储各种事件。

但是在单个表格中所有聚合所有事件让我有点担心。

因此,当我们存储事件以使用事件采购时,我们应该如何进行?我可以看到三个选项:

  1. 遵循文章中用于域事件的想法,并将所有内容存储在单个表中。

  2. 每个事件创建一个表。这里的缺点是我们需要跟踪每个聚合的事件,并且对于每个聚合,可以有各种类型的事件。所以这很容易导致一个巨大的表号。

  3. 为每个聚合创建一个表,并在那里存储该聚合的所有事件。虽然我们最终会在同一个表格中汇集不同类型的事件,但它们都与相同的聚合相关。

  4. 这三个选项中哪一个更合理?如果没有,那么在使用事件采购时存储事件的正确方法是什么?

1 个答案:

答案 0 :(得分:6)

  

但是让所有事件都对应于单个表中的所有聚合,让我有点担心。

听起来像FUD。

所有活动看起来都一样,对吧?一小段数据,以及一些元数据列,可用于将blob放在上下文中。你没有任何特别聪明的关系;在流中查找所有事件,查找由命令引起的所有事件(无论如何都将在同一个流中),这就是它。

事件可能都属于同一逻辑视图。

从物理上讲,你可能想要四处寻找,以便你可以扩展。您可能想要查看Udi Dahan在CQRS but different slides中所说的内容。但这里的基本思想是分片/ partitioning是数据库供应商已经在解决的问题,所以让他们这样做。

Postgres活动商店的讨论: