如果我使用 RDBMS(例如 SQL Server)来存储事件溯源数据,架构会是什么样子?
我已经看到了一些抽象意义上的变体,但没有具体的。
例如,假设有一个“产品”实体,对该产品的更改可能以以下形式出现:价格、成本和描述。我很困惑我是否会:
- 有一个“ProductEvent”表,其中包含产品的所有字段,其中每个更改都意味着该表中的新记录,以及适当的“谁、什么、在哪里、为什么、何时以及如何”(WWWWWH)。当成本、价格或描述发生变化时,会添加一个全新的行来表示产品。
- 将产品成本、价格和描述存储在使用外键关系连接到产品表的单独表中。当这些属性发生更改时,请酌情使用 WWWWWH 写入新行。
- 将 WWWWWH 以及表示事件的序列化对象存储在“ProductEvent”表中,这意味着必须在我的应用程序代码中加载、反序列化和重新播放事件本身,以便为给定产品重新构建应用程序状态.
特别是我担心上面的选项2。极端情况下,产品表几乎是每个属性一个表,在哪里加载给定产品的应用程序状态将需要从每个产品事件表中加载该产品的所有事件。这种桌子爆炸对我来说是错误的。
我确信“这取决于”,虽然没有单一的“正确答案”,但我试图了解什么是可以接受的,什么是完全不可接受的。我也知道 NoSQL 在这里可以提供帮助,其中可以针对聚合根存储事件,这意味着只需向数据库发出一个请求即可获取从中重建对象的事件,但我们没有使用 NoSQL 数据库时刻,所以我正在寻找替代方案。