Domain driven design 如何在事件源储蓄帐户应用程序中正确建模利息累积?

Domain driven design 如何在事件源储蓄帐户应用程序中正确建模利息累积?,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,在我使用DDD开发的事件源应用程序中,有一些储蓄帐户每天都应该累积利息。每年年底,应将累计利息资本化。我的问题是:每天的计算真的应该被视为域事件吗? 另一种方法是,在读取端计算给定时间点的累计利息,方法是遍历截至该日发生在账户上的交易(取款、存款等),并计算每天的累计利息 鉴于系统中可能有数十万个储蓄账户每天计算其累计利息,事件存储中的事件数量将迅速增长到数百万。但同时,必须在阅读端“动态”计算累积利息,而不是每天引发事件,这似乎是一个缺点。我不是银行业专家,但InterestCredited看

在我使用DDD开发的事件源应用程序中,有一些储蓄帐户每天都应该累积利息。每年年底,应将累计利息资本化。我的问题是:每天的计算真的应该被视为域事件吗?

另一种方法是,在读取端计算给定时间点的累计利息,方法是遍历截至该日发生在账户上的交易(取款、存款等),并计算每天的累计利息


鉴于系统中可能有数十万个储蓄账户每天计算其累计利息,事件存储中的事件数量将迅速增长到数百万。但同时,必须在阅读端“动态”计算累积利息,而不是每天引发事件,这似乎是一个缺点。

我不是银行业专家,但
InterestCredited
看起来像是您真正想要存储的事件,因为它会改变系统的状态

如果我理解正确的话,积累的兴趣是一个虚拟的概念——将其建模为自身的事件不会增加任何价值。无论是否存在每日<代码>利息累计<代码>事件,您都可以在年底计算资本化利息。相反,每天重新计算一个简单的读取端值似乎非常符合需要

每天的计算真的应该被视为域事件吗

你的领域专家怎么说

您可能还想回顾的第11章,其中包括“示例:通过帐户赚取利息”。这可能不会直接回答您关于域事件的问题,但它应该为您提供一些额外的上下文来构建您自己的分析

我不是一个领域专家,但我的期望是,应计利息具有法律或模型方面的影响,并且您希望对应计利息及其对您的模型的影响有一个一致的记录

根据您最初的描述,对模型的影响是每年一次的,因此我希望每个帐户每年只看到一次利息资本化事件。但我发现很难相信每日应计利息不重要,尤其是在余额变化和复利的情况下,因此我怀疑所描述的要求是否符合业务的需要

我不认为“数百万”的事件会成为一个大问题;使用CQRS模式,不管怎样,大多数读取都将来自汇总结果,所以这不是什么大问题。真正的伤害将是试图通过数百万次事件重新水合一个聚合体;但是,如果您面临性能问题,可以考虑从快照加载聚合


当然,如果每个账户都在计算自己的应计利息,那么你每年只会看到365(ish)个额外事件,这一点都不麻烦。

利息累积只是一个域事件,当它被记入账户的贷方/借方时。在这之前,它不会改变聚合状态。考虑纠正事件,发布错误(例如NSF信用逆转)。您需要更正原始和更正之间的每日错误利息计算


读取端可以按照所需的任何时间间隔负责累积应计利息

我不是银行业专家,但InterestCredited看起来像是您真正想要存储的事件,因为它将改变系统的状态。如果我理解正确的话,积累的兴趣是一个虚拟的概念——将其建模为自身的事件不会增加任何价值。每天重新计算一个简单的读取端值似乎很符合需要。谢谢您的输入。我和同事们谈过,他们也有类似的看法。把它看作是一个虚拟的概念确实帮助我理解了这个问题。我将创建一个应用程序服务,它可以计算给定时间点的累计利息。我将添加这个作为答案。也许等着其他答案的出现吧——再说一遍,我不是银行业专家,有一位专家的观点会很有趣。他说的话,再加上你想有一个存储相关数据(来自事件)的读取持久性模型,然后是一个执行实际计算的查询对象。如果从该查询对象提取接口,则可以将其用作域服务。@MikeSW“存储相关数据(来自事件)”以及。。。我想这个答案说根本没有任何有趣的累积事件,所以我想知道你会怎么做。另外,您所说的查询对象是什么意思?这个实现是什么样子的?我在想,对于简单的利息计算,一个预测就可以了。然而,利息收入在最坏的情况下可能非常复杂,因此我想在域模型中运行该逻辑在这些情况下是最好的。我考虑只将实际交易(存款、取款、资本化…)存储为事件,根据这些信息,阅读方可以通过使用域服务执行实际的利息计算公式,并传入任意一天的余额和利率来计算每日利息。直到年底利息资本化后,才应用计算利息。因此,除了年底,每天的累计金额不必用于任何计算。是的,每个账户都在计算自己的利息。我真的不希望性能问题妨碍我正确设计模型,但就我的回答和同事们所知,日常利息计算并不是一个真正的领域事件。事实上,不将每一次累积都作为一个事件单独计算,会导致