设计模式对许多实体的历史有益吗?

Tom*_*ski 12 design-patterns

我的应用程序中有一些实体类.我想保存对此实体的所有更改以及历史表中发生的一些事件.问题是实体类是不同的,用不同的原语构建,它们之间有不同的关系.

例如,在购物应用程序中,可以有:用户,项目,交易,监视.我希望能够像这样向用户显示一些活动日志:

  • 16:00你在2468交易中买了"指环王",
  • 15:30您已将"Hobbit"添加到您的监视列表
  • 15:00观看物品的"Silmarillion"价格从15降至12,50欧元,
  • 14:30你把你的名字从"Tomasz"改为"Tom".

此日志涉及许多内容:

  • 带有项目"LotR"的新交易实体2468,
  • 新的Watch实体与项目"Hobbit"和我的帐户相关联,
  • 更新的物品价格(但存储了旧价格和新价格),
  • 更新的用户名(旧的和新的存储).

我的主要问题是如何跟踪这些数据?

  1. 我应该拥有与许多实体表一样多的表来保持其更改吗?UserVersions,ItemVersions等?
  2. 我应该查询所有版本表,加入并排序结果以生成此日志吗?
  3. 或者也许应该有一个表版本的列"实体","OldValue","NewValue" - 约束和外键怎么样?是不是太脏了解决方案?
  4. 这有设计模式吗?
  5. 最后如果你知道 - Facebook如何做到这一点?:)

kst*_*uch 6

您可能对名为Event Sourcing的设计模式感兴趣.

事件源采用确保应用程序状态的所有更改都存储为一系列事件.我们不仅可以查询这些事件,还可以使用事件日志重建过去的状态,并作为自动调整状态以应对追溯更改的基础.

至于如何存储此类事件,实际上取决于要求.有时只需将其序列化为JSON就足够了.

事件采购包含在CQRS的大多数实现中,因此您几乎可以在与其相关的任何资源中找到其他信息.