我正在尝试将域事件存储在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
我不确定:
答案 0 :(得分:6)
1.我应该存储域名事件的推动者吗?
如果您将启动器存储为事件有效负载的一部分而不是元数据,我认为它更灵活。应该在域外处理安全问题。并非每个事件都是由用户引发的,尽管您可以为它们制作一个假的(CysJob的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术语)。 shipping.domain_events用于发货上下文和ordering.domain_events用于订购上下文。
以下是axon-framework中可能有用的架构
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);