gpt4 book ai didi

database - 事件溯源 - 显示旧数据

转载 作者:搜寻专家 更新时间:2023-10-30 22:28:21 26 4
gpt4 key购买 nike

这是一个菜鸟(我认为)事件溯源问题。

例如我们有:

  • 鞋匠鲍勃
  • 客户爱丽丝

鞋匠鲍勃有:

  • “shoemaker_business_locations”(营业地点地址)
    • 第一个地址是“88d8 - 5 Baker Street”(1 月 添加)
    • 第二个地址是“73c6 - 6 Cadman Plaza”(3 月 添加)
    • 在某个时候(10 月)鞋匠从 “贝克街 5 号”到“贝克街 11 号”(街区下方的几栋房子)

假设我们有一个“shoe_repair_order”(聚合根?)

  • 我们收到了 Alice 的修鞋订单七月的某个时候,鞋匠鲍勃搬家之前他在街区的营业地点。

  • 假设 Alice 12 月 查看此订单。显然,她不必知道鲍勃搬家了。当她看到她的订单时,我认为她应该(至少)看到旧的营业地点和/或“在贝克街 5 号订购(新地址是贝克街 11 号 - 于 10 月 6 日更新)”。

问题:我们如何设计事件源系统来显示订单的旧地址?

  • 我们是否必须始终为我们的订单存储一个事件,比如“OrderLocationAdded”并在我们的订单事件中存储实际地址的副本 -这样每个订单都会有一个正确的旧位置,只需从事件中获取。只有发出新事件,例如“OrderLocationUpdated”,我们才能更新它如果需要,针对该特定订单。

  • 我们是否发出“OrderLocationAdded”事件并引用地址“88d8 AT VERSION 1”,这样我们就知道要查找营业地点的 VERSION 1。我们将不得不重播“shoemaker_business_locations”上的事件直到我们看到我们地址的“版本 X”(在我们的例子中是版本 1)。这就是我们必须对所有版本为地址低于当前设置的版本(版本 1)。

  • 还有其他方法吗?

    也许我们的读取模型只是存储了不同版本的所有地址信息,当查询某个版本时我们不必在我们的写入模型中重放事件,而只需从我们的读取模型中获取版本 1 的地址?

最佳答案

我认为做到这一点的最佳方式最终将取决于您如何设计领域模型,但这是我处理该问题的方式:

我们需要在领域模型中表示地址。这意味着,地址将是值对象、实体或聚合。在这三者中,地址实际上只能是该域中的值对象或实体,因为我们是修鞋应用程序而不是地址簿。实体具有某些属性,例如通过其 ID 区分,以及某些限制,例如仅作为一个聚合的一部分,地址似乎不满足这些属性。因此,我会将地址视为该域中的值对象。

在“shoe_repair_order”聚合上定义 OrderLocationAdded 事件时,您需要决定是在事件中包含地址的完整详细信息,还是使用对地址的引用。由于地址是一个值对象(它由其数据定义,而不是由 ID 定义),答案是在事件中包含值对象。这样,当您重放事件以构建订单的当前状态时,它仍将具有原始地址的详细信息。

如果您还想在订单上显示新地址,您可以使用另一个事件(例如 BusinessMovedToNewLocation)和新地址的详细信息,并将其添加到订单中。此事件不会替换原始地址,它只会让您显示商家现在位于不同位置的信息性消息。

关于database - 事件溯源 - 显示旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48119955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com