Domain driven design 事件源系统中的预测
在事件源系统中,我有一个类型为Order的聚合根。让我们假设以下事件是 发生:Domain driven design 事件源系统中的预测,domain-driven-design,projection,cqrs,event-sourcing,Domain Driven Design,Projection,Cqrs,Event Sourcing,在事件源系统中,我有一个类型为Order的聚合根。让我们假设以下事件是 发生: OrderPlaced(orderId、placedAt、customerId、orderLines),其中OrderLine(lineId、productId、price) OrderAccepted(orderId) 假设我们需要两个不同的投影: 包含每个客户的所有已接受订单(按年份分组)总价的预测。大概是这样的: OrdersByCustomer(customerId,SummationOnAccepted
- OrderPlaced(orderId、placedAt、customerId、orderLines),其中OrderLine(lineId、productId、price)
- OrderAccepted(orderId)
- 使用customerId接受订单。但我觉得这不是一个好方法——那么我需要将其纳入所有活动中 这将与projectionId/documentId与aggregateId不同的投影相关
- 或者有一个单独的表,其中包含orderId和customerId之间的映射,因此投影可以查询customerId-此表可能需要在命令处理程序中更新 订单的总金额
- 或者,我们可以为CustomerIdByOrderId创建一个投影-但在这里,我认为投影可以位于事件流的不同位置-这可能 也可能会引起问题
我想知道更有经验的事件源程序如何解决这些问题…?:)对此,我们非常感谢您的任何意见。事件源系统的妙处在于,您需要的所有信息都封装在事件中,或者至少应该封装在事件中 我假设您使用的是CQRS模式,根据您的描述,问题集中在投影应该是什么样子。换句话说,您不应该真正需要更改命令/事件端的任何内容,而是应该关注如何从事件中获取所需的数据,以建立适当的预测 我对“锡拉”并不熟悉,但你可以自由地建立你的预测,无论哪种方式对你有效。请记住,投影只是可以从事件中查询的数据 我能想象的最简单的事情就是只存储每个订单,包括状态。类似这样的内容(在可怕的伪代码中): 注意,上面的代码假定事件是按顺序处理的 我们需要在接收时更新多个预测 下单了。这在事件来源预测-更新中是否正常 多重预测公关活动
当然,这很正常。您可以使用单个事件来更新多个投影,也可以使用多个事件来更新单个投影,或者两者的组合。谢谢。这在某种程度上是有帮助的:)经过一些研究,我得出结论,我将尝试实现一个叫做Projectionst的东西,它负责播放所有包含的投影。让一个投影质疑另一个投影。这里我唯一能看到的挑战是,Projectionis中的投影必须按正确的顺序投影。我已经看到了一些使用这种方法的例子,所以我希望这是一种不错的方法:)
-- Order Summary event handler
on(orderPlaced):
insert into Order(orderId, datePlaced, customerId, orderLines, status)
values (orderPlaced.orderId, orderPlaced.date, orderPlaced.customerId, orderLines, 'placed')
on(orderAccepted):
update Order
set status = 'accepted'
where orderId = orderAccepted.orderId
-- Sum of accepted orders per customer and year
select customerId, year, sum(orderLines.price) from Orders
where status = 'accepted'
group by customerId, year(datePlaced)
-- Sum per product of accepted orders
select productId, sum(orderLines.price) from Orders
where status = 'accepted'
group by orderLines.productId, year(datePlaced)