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

时间:2016-06-14 01:48:06

标签: json events domain-driven-design event-store domain-events

我正在考虑重构一个现有的代码库,然后再与我们的第一个客户一起放松,我真的不喜欢当前的域事件存储结构,我试图想出一个好的存储许多&的方式RDB表中的事件非常不同。

架构:

  • 网络应用
  • 爪哇
  • 春季4
  • Spring JDBC
  • MSSQL

详细说明:

  • 40 + - 不同的事件,每个事件都与聚合根或其中一个子元素相关。
  • 存储事件的详细信息,但不存储对象状态(因此没有CQRS事件来源)
  • 事件仅用于报告
  • 报告由java对象提供。 IE浏览器。报告不直接从SQL运行。

目前,事件存储在每个有界上下文的单个事件表中。为了容纳所有不同的事件类型和数据表模式看起来像这个

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

不,我不喜欢它,不,我不负责这样做。

的问题:

  • context_1_xxx字段易碎且难以维护/故障排除/扩展
  • 填充到一个表中的所有内容都是性能问题(即使报告对性能不敏感)
  • 事件链接到域对象;它们不存储对象的状态。例如。如果项目被删除,记录的事件将毫无用处

我的直觉告诉我创建40个不同的表,每个事件都有唯一的模式不是答案。相反,我正在考虑序列化(JSON)要与事件数据一起保存的域对象的快照。
这似乎很方便解决方案:

  • 我们已经使用Spring / Jackson模块为基于浏览器的客户端序列化对象。
  • 团队对序列化/反序列化过程非常熟悉,因此没有重要的学习曲线。
  • 事件数据必须通过应用程序返回以生成报告,通过与杰克逊反序列化很容易

我能看到的唯一真正的缺点是:   - 无法使用基于SQL的第三方报告工具   - 无法索引存储对象属性(JSON)上的表

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

我还缺少什么?是否有既定的最佳方法来实现这一目标?你是怎么做到的?

1 个答案:

答案 0 :(得分:2)

从Greg Young的Building an Event Storage开始。

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

  

我的直觉告诉我创建40个不同的表,每个事件的模式都不是唯一的答案。

可能不是。对于所有类型的事件,首先剪切应该是单个表。你有一个blob(json很好)用于事件数据,一个类似blob用于事件元数据,然后是一堆用于提取正确排序的事件历史记录的列。

  

相反,我正在考虑序列化(JSON)要与事件数据一起保存的域对象的快照。

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

“Snapshot”虽然是一个提升者 - 你不需要事件数据的快照,因为事件是不可变的。你绝对不希望将状态快照(即汇总事件历史的结果)与事件本身混合在一起。

跟进:了解GetEventStore .NET客户端writesreads事件历史如何为您提供有关如何设计架构的其他想法。请注意,事件数据/元数据正在作为blob处理。