我正在考虑重构一个现有的代码库,然后再与我们的第一个客户一起放松,我真的不喜欢当前的域事件存储结构,我试图想出一个好的存储许多&的方式RDB表中的事件非常不同。
架构:
详细说明:
目前,事件存储在每个有界上下文的单个事件表中。为了容纳所有不同的事件类型和数据表模式看起来像这个
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,
...重复10x ......
所以,例如(order = aggregate root,item = order 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个不同的表,每个事件都有唯一的模式不是答案。相反,我正在考虑序列化(JSON)要与事件数据一起保存的域对象的快照。
这似乎很方便解决方案:
我能看到的唯一真正的缺点是: - 无法使用基于SQL的第三方报告工具 - 无法索引存储对象属性(JSON)上的表
我可以通过进一步将事件存储分解为几个不同的表来缓解问题#2。
我还缺少什么?是否有既定的最佳方法来实现这一目标?你是怎么做到的?
答案 0 :(得分:2)
从Greg Young的Building an Event Storage开始。
Konrad Garus描述了使用PostgresSQL的事件存储。
我的直觉告诉我创建40个不同的表,每个事件的模式都不是唯一的答案。
可能不是。对于所有类型的事件,首先剪切应该是单个表。你有一个blob(json很好)用于事件数据,一个类似blob用于事件元数据,然后是一堆用于提取正确排序的事件历史记录的列。
相反,我正在考虑序列化(JSON)要与事件数据一起保存的域对象的快照。
这是一个奇怪的短语。事件数据的JSON表示?那讲得通。
“Snapshot”虽然是一个提升者 - 你不需要事件数据的快照,因为事件是不可变的。你绝对不希望将状态快照(即汇总事件历史的结果)与事件本身混合在一起。
跟进:了解GetEventStore .NET客户端writes和reads事件历史如何为您提供有关如何设计架构的其他想法。请注意,事件数据/元数据正在作为blob处理。