gpt4 book ai didi

mysql - 设计: use independent or correlated status for parent and child

转载 作者:行者123 更新时间:2023-11-29 21:50:18 25 4
gpt4 key购买 nike

这是一个设计问题。我们的系统中有两个实体:Campaign、Assignment。一项事件可以分配给多个用户,从而导致多项分配。 (可以是数万)。将其视为“TaskRabbit”。事件和分配都有一个“状态”字段。

显然,当事件“暂停”时,分配也被视为“暂停”。当事件“结束”时,分配也结束。

用户需要按状态过滤他们的作业,比如找出所有已结束的作业。

问题是,

1) 当事件暂停或结束时,我是否应该将分配状态更改为“暂停”|“结束”?优点是可以很容易地对作业进行过滤。缺点是每个营销事件可能有 100k 的分配。根据营销事件的状态批量更新其状态未执行。另外,缓存层不支持批量更新。

2) 或者,使分配“状态”完全独立于广告系列状态。优点是,现在不需要在事件状态发生变化时批量更新分配。缺点是,现在要进行过滤,我需要首先获取已过滤状态的广告系列的 ID,然后执行第二次查询以获取具有额外条件的相应分配:(这些已过滤 ID 中的广告系列 ID)。

有什么建议吗?

最佳答案

你能改变你看待系统的方式吗?

Apparently, when campaign is 'paused', Assignment is also considered 'paused'.

你可以将Assignment的is_paused属性视为关系的事件吗?这样,如果Assignment暂停,则视为临时删除。

在这种情况下,当您暂停营销事件时,您不应将此暂停状态传播到所有分配,因为该链接仍保持事件状态并且仅传达营销事件状态。

更新:

我现在将详细阐述我的答案。

我的建议是将分配作为实体从系统中删除。当然,我不像您那样从内部看到系统,但看起来您的系统中只有两个实体:UserCampaign。分配只是营销事件与用户之间的 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/

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