使用CQRS和事件采购时如何查询历史数据。举个例子,如果我正在建立一个有收入报告的时间表系统,我需要查询每个员工的工时,工资率和账单费率。有一个EMPLOYEE_PAY_RATE表,其中包含EmployeeID,PayRate和EffectiveDate,以及一个具有ClientID,EmployeeID,Rate和EffectiveDate的BILL_RATE表。这些表中的生效日期基本上保留了运行历史记录,因此我们可以准确报告。
如果我们采用DDD,CQRS和事件采购路线,我们如何生成这样的报告?这不像我们可以以相同的方式查询事件存储。我看过像Axon这样的框架,但不确定它是否允许我们从报告的角度做我们需要做的事情。
答案 0 :(得分:2)
使用CQRS和事件采购时如何查询历史数据。
与查询实时数据的方式非常相似:您可以从事件历史记录中构建所需的视图,然后在视图中查询所需的数据。
借用您的示例 - EMPLOYEE_PAY_RATE表和BILL_RATE表可能支持您的视图。重播您的活动,因为有趣的事情会更新相应的表格。 TADA。
一个可能并不明显的重要想法 - 对于像历史报告这样的低延迟,您可能希望历史聚合器从事件存储中提取事件,而不是将事件推送到聚合器。拉动方法可以更容易地跟踪您的位置,因此您不需要重复大量工作,担心您是否已收到所有应该发生的事件,订购,等等。
答案 1 :(得分:1)
您报告的只是事件的另一个读取模型/投影,例如通过监听相关事件填充的SQL表。
如果表很大,即很多员工,为了快速,你应该避免使用joins
,保持数据非规范化;因此,对于每个员工和日(或您想要的任何粒度),您将在包含员工ID 和名称的表格中有一行,包含当天的开始日期和结束日期以及其他包含的列相关数据,即工资率。为了避免使用joins
,您也可以通过听取相关的员工事件(例如EmployeeChangedName
)来保持最新状态。