我的宠物学习项目是一个简单的项目管理/任务应用程序,具有以下实体关系:
项目有很多任务 任务有很多活动
Activity基本上是一个带有startedAt,endedAt和durationInSeconds的时间日志。
项目和任务有一个名为durationInSecondsSum的列,每次持久,更新,删除活动时都需要更新。
durationInSecondsSum是Activity :: durationInSeconds之和的聚合字段。
我的问题是......在Project和Task中更新durationInSecondsSum属性的最佳方法是什么。
我考虑过的可能选项,但还没有完全包裹我的脑袋:
聚合根。
如此处所述:http://doctrine-orm.readthedocs.org/en/latest/cookbook/aggregate-fields.html。
给定一个Activity :: durationInSeconds可以随时编辑,并且更改需要从Activity冒泡到Task和Project我不知道如何在链中实现这一点。
学说事件
我之前已经实现了一个postFlush事件来计算前一个项目中的总和。在阅读了有关事件的更多信息后,似乎这是一个糟糕的实现,可能导致双重实体。
我还考虑过onFlush可能会更好。
我在这里看到的问题是,如果活动尚未保存,我将无法直接从数据库计算总和。
消息队列
触发更新任务和项目的消息似乎有些过分。
持续时间服务
一个单独的服务,它接收任务/项目的集合并动态计算它们的持续时间,而不会将该数据保存到数据库。
非常感谢任何指导/经验/战争故事。