Cqrs 使用RDBMS作为事件源存储
如果我使用RDBMS(例如SQL Server)来存储事件源数据,那么模式会是什么样子 我见过一些抽象意义上的变化,但没有具体的变化 例如,假设有一个“产品”实体,对该产品的更改可以是:价格、成本和描述。我对我是否会:Cqrs 使用RDBMS作为事件源存储,cqrs,event-sourcing,Cqrs,Event Sourcing,如果我使用RDBMS(例如SQL Server)来存储事件源数据,那么模式会是什么样子 我见过一些抽象意义上的变化,但没有具体的变化 例如,假设有一个“产品”实体,对该产品的更改可以是:价格、成本和描述。我对我是否会: 有一个“ProductEvent”表,该表包含产品的所有字段,其中每个更改意味着该表中的一条新记录,以及“who、what、where、why、when和how”(WWH)(视情况而定)。当成本、价格或描述发生更改时,将添加一个全新的行来表示产品 将产品成本、价格和说明存储在与具
我确信“这要看情况而定”,虽然没有单一的“正确答案”,但我正试图对什么是可接受的,什么是完全不可接受的有一种感觉。我也知道NoSQL在这方面很有帮助,事件可以存储在聚合根上,这意味着只需要向数据库发出一个请求,就可以获取要从中重建对象的事件,但是我们目前没有使用NoSQL db,所以我正在寻找替代方案。事件存储不需要知道事件的特定字段或属性。否则,对模型的每一次修改都将导致必须迁移数据库(就像老式的基于状态的持久化一样)。因此,我根本不推荐选项1和2 下面是中使用的模式。如您所见,“Events”表将相关数据存储为CLOB(即JSON或XML)。这与选项3相对应(只是没有“ProductEvents”表,因为您只需要一个通用“Events”表。在Ncqrs中,到聚合根的映射通过“EventSources”表进行,其中每个EventSource对应于实际的聚合根。) 的SQL持久性机制基本上由一个名为“Commits”的表和一个BLOB字段“Payload”组成。这与Ncqrs中几乎相同,只是它以二进制格式序列化事件的属性(例如,增加了加密支持) 格雷格·杨(Greg Young)建议采用类似的方法,如图所示 他的原型“事件”表的模式如下:
Table Events
AggregateId [Guid],
Data [Blob],
SequenceNumber [Long],
Version [Int]
你可能想看看Datomic Datomic是一个灵活的、基于时间的事实数据库,支持查询和连接,具有弹性可伸缩性和ACID事务 我写了一份详细的答复 你可以看Stuart Halloway讲解Datomic设计的演讲
由于Datomic及时存储事实,因此您可以将其用于事件源用例等。可能的提示是“缓慢变化的维度”(type=2)后面的设计应帮助您涵盖:
- 事件发生顺序(通过代理键)
- 每个状态的耐久性(有效期从-有效期到)
Table Events
AggregateId [Guid],
Data [Blob],
SequenceNumber [Long],
Version [Int]
CREATE TABLE [dbo].[EventFlow](
[GlobalSequenceNumber] [bigint] IDENTITY(1,1) NOT NULL,
[BatchId] [uniqueidentifier] NOT NULL,
[AggregateId] [nvarchar](255) NOT NULL,
[AggregateName] [nvarchar](255) NOT NULL,
[Data] [nvarchar](max) NOT NULL,
[Metadata] [nvarchar](max) NOT NULL,
[AggregateSequenceNumber] [int] NOT NULL,
CONSTRAINT [PK_EventFlow] PRIMARY KEY CLUSTERED
(
[GlobalSequenceNumber] ASC
)