SQL 中的域事件存储...使用 JSON 序列化?

Domain event storage in SQL... use JSON serialization?

我正在考虑重构一个现有的 code-base,然后再与我们的第一个客户一起发布,我真的不喜欢当前的域事件存储结构,我正试图来想出一种在 RDB tables.

中存储许多非常不同的事件的好方法

架构:

详情:

目前事件存储在每个限界上下文的单个事件 table 中。为了保存所有不同的事件类型和数据,table 架构看起来像这样

event_id    long,
event_type  varchar,
event_time  datetime,
context_1_key varchar,
context_1_val varchar,
context_2_key varchar,
context_2_val varchar,
context_3_key varchar,

...重复 10 次...

所以,例如(order=聚合根,item=child of order):

event_type=ITEM_OPEN
context_1_key=ORDER_ID
context_1_value=1000
context_2_key=ITEM_ID
context_2_value=2000

不,我不喜欢,不,我不应该为此负责。

问题:

我的直觉告诉我,创建 40 个不同的 tables 并为每个事件设置唯一的模式并不是答案。相反,我正在考虑序列化(JSON)要与事件数据一起保存的域 object(s) 的快照。
看来方便解决:

我能看到的唯一真正的缺点是: - 无法使用基于 SQL 的第三方报告工具 - 无法在存储的 object(JSON)

的属性上索引 tables

我可以通过将事件存储进一步分解为几个不同的 table 来稍微缓解问题 #2。

我还缺少什么?是否有既定的 best-approach 来实现这一点?你是怎么做到的?

从 Greg Young 的 Building an Event Storage 开始。

Konrad Garus 描述了一个使用 PostgresSQL 的事件存储。

My gut tells me creating 40 different tables with schema unique to each event is not the answer.

可能不会。对于所有类型的事件,第一次剪辑应该是单个 table。您有一个用于事件数据的 blob(json 很好),还有一个用于事件 metadata 的类似 blob,然后是一堆用于提取正确排序的列事件的历史。

Instead I was thinking of serializing(JSON) a snapshot of the domain object(s) to be saved along with the event data.

这是一个奇怪的短语。 JSON 事件数据的表示?这就说得通了。

不过,

"Snapshot" 让人大跌眼镜——您不需要事件数据的快照,因为事件是 immutable。您肯定不希望将状态快照(即汇总事件历史的结果)与事件本身混合在一起。

跟进:查看 GetEventStore .NET 客户端 writes and reads 事件历史记录可能会给您关于如何设计架构的更多想法。请注意,事件 data/metadata 正在作为 blob 处理。