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

标签 mysql database-design elasticsearch architecture

这是一个设计问题。 我们的系统中有两个实体: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/

相关文章:

mysql - 如何设置mysqladmin默认用户和密码?

database-design - 多列主键?

sql - 什么更好 : to have many similar databases or one database with similar tables or one database with one table?

elasticsearch - 使用 NEST 在索引上设置 Elasticsearch 时间戳路径?

elasticsearch - 提示者补全Elasticsearch不适用于数字

mysql - 如何更新记录的详细信息

php - 在 MYSQL IN 中使用 and 运算符时结果为空

elasticsearch - 使用 Logstash 计算特定日志事件的持续时间

java - 这个持久性单元配置有什么问题?

mysql - 数据库:表设计/结构