我一直在询问有关事件采购的很多问题,所以对此表示歉意,但我想从一开始就指出这一点。
| p_key | invoice_id | EmployeeId | Event type | Version | Data |
|-------|------------|------------|-------------------|---------|------|
| 1 | 12345 | E456 | Invoice_Generated | 1 | JSON |
| 2 | 12345 | E567 | Invoice_Reviewed | 2 | JSON |
| 3 | 12345 | E456 | Invoice_Paid | 3 | JSON |
| 4 | 12345 | E142 | Invoice_Comment | 4 | JSON |
| 5 | 12345 | E412 | Invoice_Comment | 5 | JSON |
| 6 | 12346 | E999 | Invoice_Paid | 7 | JSON |
| 7 | 12345 | E456 | Invoice_Refunded | 8 | JSON |
我假设invoiceId是聚合。由于每次对发票所做的更改都会增加版本号。
使用案例
事件存储包含发票上应用的所有事件,还包含有关员工应用它的信息。在当前方案中,生成,审核和支付发票。有人注意到一些问题发表了一些评论,然后我们决定在我们退还旧的付款之前发布新的付款[正在撤消的事件在历史早期]。
API CALL:
退款/发票/ {invoiceid} / {雇员}
事情的流程
选项1
问题
选项2:
问题
不确定这是否正确。我们是否应该多次将事物添加到事件流中。
也可以只使用发票ID和发票ID和员工ID一次查询事件数据库两次
如果我遗失了某些内容,或者我的版本样式错误或者我的汇总假设是错误的,请告诉我。
答案 0 :(得分:1)
我建议你在脑海中清楚几点。
无论您对域模型做出哪些更改,您可能都希望使用相同的管道;无论是处理新命令还是撤消先前的命令,都应该以相同的方式对待实际的机制。
如果"撤消"是你需要的东西,那么你的领域模型应该知道如何做,你保留在内存中的数据的形状应该支持这些功能。因此,如果您正在设计一个发票模型,允许您查询其历史记录中的特定事件,那么您的内存表示应该可以让您访问这些事件。
性能优化的第一条规则是“不要”,但如果您担心从数据库中读取数据的成本,则可以缓存模型的热表示。
如果你想在关系数据库中找出乐观的写法,Jonathan Oliver是一个很好的起点。