Architecture 如何在数据库中持久化事件日志数据?
在我的应用程序中,我强烈要求记录实体的每个事件,并考虑使用模式,即所有域更改都有显式类,对域对象的任何更改只能使用这些事件类。然后,您可以根据需要回滚并重新应用这些更改,就像在源代码管理系统中一样 这将为我解决许多问题,但我不知道如何将事件对象持久化到db。我可能有数百种事件类型,因此我的选项有限:Architecture 如何在数据库中持久化事件日志数据?,architecture,domain-driven-design,Architecture,Domain Driven Design,在我的应用程序中,我强烈要求记录实体的每个事件,并考虑使用模式,即所有域更改都有显式类,对域对象的任何更改只能使用这些事件类。然后,您可以根据需要回滚并重新应用这些更改,就像在源代码管理系统中一样 这将为我解决许多问题,但我不知道如何将事件对象持久化到db。我可能有数百种事件类型,因此我的选项有限: 为每种事件类型构建一个表(数百个表?对实体的引用如何?) 为所有事件构建一个巨大的表(有数千列?) 以某种方式将事件的二进制表示形式存储在db(??) 将其存储在某个单独的文件中(?) 你知道如
- 为每种事件类型构建一个表(数百个表?对实体的引用如何?)
- 为所有事件构建一个巨大的表(有数千列?)
- 以某种方式将事件的二进制表示形式存储在db(??)
- 将其存储在某个单独的文件中(?)
你知道如何做到这一点吗?有一个很好的模拟现实生活的会计系统。每一个专业会计系统基本上都是基于交易日记账,这些日记账为财务状况的每一次变化提供了背景——相当于实体的状态变化 我经常使用这种模式,它通常是一组(不是太多)表,其中至少有一个主键、一个时间戳和一个用户名 如果您想分享一下您的实体模型,我们可以讨论一些具体的案例。但通常情况下,表的结构会从与记录的真实事件相关的用例中消失 一些好处-
这里的基本问题是,您有一个完全不相关的模型,您正试图将其与关系数据库相匹配。这样做不会很好。因此,先从细节开始,思考一下你的两个基本方向选择:
InvoiceCreate invoice_number=12345 date=2009-05-21 salesperson="Jill Gaines" ...
这有很多好处:
- 它是人类可读的,因此易于调试
- 这样的文件可以通过grep、sed、awk等进行处理,以便进行特别查询
- 它是人工编写的,有利于调试、测试和修复损坏的数据
- 这很容易解析
- 它没有链接到任何特定的对象结构、格式甚至语言,因此您可以轻松地更改应用程序,而不必担心与序列化数据的兼容性
- 当您需要更改数据时,数据本身可以很容易地更新(通常使用简单的sed脚本!)