这是一个设计问题。 我们的系统中有两个实体:Campaign、Assignment。一项事件可以分配给多个用户,从而导致多项分配。 (可以是数万)。将其视为“TaskRabbit”。事件和分配都有一个“状态”字段。
显然,当事件“暂停”时,分配也被视为“暂停”。当事件“结束”时,分配也结束。
用户需要按状态过滤他们的作业,比如找出所有已结束的作业。
问题是,
1) 当事件暂停或结束时,我是否应该将分配状态更改为“暂停”|“结束”?优点是可以很容易地对作业进行过滤。缺点是每个营销事件可能有 100k 的分配。根据营销事件的状态批量更新其状态未执行。另外,缓存层不支持批量更新。
2) 或者,使分配“状态”完全独立于广告系列状态。优点是,现在不需要在事件状态发生变化时批量更新分配。缺点是,现在要进行过滤,我需要首先获取已过滤状态的广告系列的 ID,然后执行第二次查询以获取具有额外条件的相应分配:(这些已过滤 ID 中的广告系列 ID)。
有什么建议吗?
最佳答案
你能改变你看待系统的方式吗?
Apparently, when campaign is 'paused', Assignment is also considered 'paused'.
你可以将Assignment的is_paused属性视为关系的事件吗?这样,如果Assignment暂停,则视为临时删除。
在这种情况下,当您暂停营销事件时,您不应将此暂停状态传播到所有分配,因为该链接仍保持事件状态并且仅传达营销事件状态。
更新:
我现在将详细阐述我的答案。
我的建议是将分配作为实体从系统中删除。当然,我不像您那样从内部看到系统,但看起来您的系统中只有两个实体:User
和 Campaign
。分配只是营销事件与用户之间的 N:1 关系,对吧?
此关系本身不是一个实体,但在数据库级别,它将存储在具有(user_id,campaign_id)列的单独的campaign_to_user
表中。但也许你的 ORM 系统允许像 Laravel Eloquent 那样定义关系属性?因此,该表实际上看起来像(user_id、campaign_id、active)。
当您查询用户
的营销事件
时,您可以使用WHERE active = TRUE
在campaign_to_user表上执行选择。
我相信,这可以通过状态更新解决问题。如果您想要禁用特定用户的特定营销事件,您可以操作该 active
属性,然后您的 ORM 即可完成这项工作。如果您完全禁用营销事件,则所有用户链接均处于事件状态,但营销事件将关闭。
关于mysql - 设计: use independent or correlated status for parent and child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33714646/