我试图在postgres数据库中存储域事件。我对很多事情都不确定,而且我不想以后重新设计这个结构,所以我正在向有事件溯源经验的人寻求指导。我现在有以下表格:
domain events
version - or event id, integer sequence, helps to maintain order by replays
type - event type, probably classname with namespace
aggregate - aggregate id, probably random string for each aggregate
timestamp - when the event occured
promoter - the promoter of the event, probably user id
details - json encoded data about the properties
我不确定的:
- 我应该存储域事件的启动子吗?
它可以帮助找到被安全漏洞入侵的账户,但是我不知道用CRONjob来存储什么。 - 我应该用什么格式存储事件类型?
我应该添加一个事件类型表,还是类名就足够了?
我应该添加事件组吗? - 我对有界上下文的定义感到困惑。据我所知,每个聚合可以有多个有界上下文,因此我可以在多个模块中使用单个聚合的不同方面。这听起来不错,因为例如,帐户可以与许多事情相关,包括身份验证、授权、用户配置文件、用户帖子、用户合同等等。
我不确定的是,一个域事件可以有多个有界上下文,或者只有一个,那么我是否也应该存储事件上下文?(对于我想重播与单个上下文相关的事件的情况)
如何实现这么多属性在一个单一的聚合类,我应该使用某种组合?
1。我应该存储域事件的启动子吗?
我认为如果您将启动子存储为事件有效负载的一部分而不是元数据,则会更灵活。安全问题应该在域外处理。并非每个事件都是由用户引发的,尽管您可以为他们创建一个假事件(为CronJob创建一个SysAdmin)。
例如:ManualPaymentMadeEvent { //store this object as details in your schema
amount,
by_user//In this case, developers can determine whether store the promoter case by case
}
2。我应该用什么格式存储事件类型?
我应该添加一个事件类型表,还是类名就足够了?我应该添加事件组吗?
我认为类名是足够的。添加另一个表使事件读取(通过连接表)变得复杂,并且我认为只有在重命名类名时才会增加价值(更新事件类型表中的一行)。但我认为使用
不会增加太多麻烦。update domain_events set
aggregate_type = 'new class name'
where aggregate_type = 'origin class name'
我对事件组的理解不太清楚,你能多解释一下吗?
3。我不确定的是,一个域事件可以有多个有界上下文,或者只有一个,所以我应该将事件上下文存储为好吗?
有时事件用于集成多个上下文。但是每个事件只在一个上下文中引发。例如,在订购上下文中引发ManualPaymentMadeEvent,并且发货上下文中的事件侦听器也使用它,将其视为开始发货的触发器。
我更喜欢使用每个数据库用户(oracle术语)每个上下文。航运。Domain_events用于发送上下文和排序。Domain_events用于排序上下文。
这是axon-framework中的schema,可能会有帮助
create table DomainEventEntry (
aggregateIdentifier varchar2(255) not null,
sequenceNumber number(19,0) not null,
type varchar2(255) not null, --aggregate class name
eventIdentifier varchar2(255) not null,
metaData blob,
payload blob not null, -- details
payloadRevision varchar2(255),
payloadType varchar2(255) not null, --event class name
timeStamp varchar2(255) not null
);
alter table DomainEventEntry
add constraint PK_DomainEventEntry primary key (aggregateIdentifier, sequenceNumber, type);