如果我使用关系型数据库(例如SQL Server)存储事件溯源数据,它的模式可能是什么样子?
我看到一些抽象概念上的变化,但没有具体的例子。例如,假设有一个“产品”实体,对该产品的更改可以采用以下形式:价格、成本和描述。 我对以下几种情况感到困惑: 1. 是否应该使用“ProductEvent”表,其中包含产品的所有字段,每次更改都意味着在该表中添加一个新记录,并根据需要添加“who, what, where, why, when and how” (WWWWWH)。当成本、价格或描述发生变化时,将添加一个全新行来表示产品。 2. 将产品成本、价格和描述存储在单独的表中,并通过外键关系连接到产品表。当这些属性发生变化时,写入新行,并添加适当的WWWWWH。 3. 在“ProductEvent”表中存储WWWWWH及其序列化对象代表的事件,这意味着必须在我的应用程序代码中加载、反序列化和重播事件,以便为给定的产品重新构建应用程序状态。
特别是我担心以上第二个选项。 如果走向极端,产品表几乎会成为每个属性的一个表,为了加载给定产品的应用程序状态,需要从每个产品事件表中加载该产品的所有事件,这种表扩展似乎不太对。
我相信“情况因人而异”,虽然没有一个单一的“正确答案”,但我正在试图了解什么是可以接受的,什么是完全不能接受的。 我也知道NoSQL可以在这里提供帮助,其中事件可以存储在聚合根中,这意味着只需要一次数据库请求即可获取事件以重建对象,但我们目前没有使用NoSQL数据库,因此我正在寻找替代方案。
我看到一些抽象概念上的变化,但没有具体的例子。例如,假设有一个“产品”实体,对该产品的更改可以采用以下形式:价格、成本和描述。 我对以下几种情况感到困惑: 1. 是否应该使用“ProductEvent”表,其中包含产品的所有字段,每次更改都意味着在该表中添加一个新记录,并根据需要添加“who, what, where, why, when and how” (WWWWWH)。当成本、价格或描述发生变化时,将添加一个全新行来表示产品。 2. 将产品成本、价格和描述存储在单独的表中,并通过外键关系连接到产品表。当这些属性发生变化时,写入新行,并添加适当的WWWWWH。 3. 在“ProductEvent”表中存储WWWWWH及其序列化对象代表的事件,这意味着必须在我的应用程序代码中加载、反序列化和重播事件,以便为给定的产品重新构建应用程序状态。
特别是我担心以上第二个选项。 如果走向极端,产品表几乎会成为每个属性的一个表,为了加载给定产品的应用程序状态,需要从每个产品事件表中加载该产品的所有事件,这种表扩展似乎不太对。
我相信“情况因人而异”,虽然没有一个单一的“正确答案”,但我正在试图了解什么是可以接受的,什么是完全不能接受的。 我也知道NoSQL可以在这里提供帮助,其中事件可以存储在聚合根中,这意味着只需要一次数据库请求即可获取事件以重建对象,但我们目前没有使用NoSQL数据库,因此我正在寻找替代方案。