我有 3 个表来维护我们的时事通讯订阅。
- 第一列存储用户数据,每个数据都有唯一的 ID。
- 第二列存储时事通讯列表(即用户可以订阅“Core 更新”和/或“提示和技巧”):
id |名称 |描述
- 第三个表存储用户和列表之间的颜色
id |用户 ID |列表 ID |活跃
假设有 5 个可用列表,并且用户订阅了列表号 1,3 和 5。
当他将新闻通讯偏好更新为 1,2 和 4(仅限)时。我收到带有 userId 和新的列表 id 集 [1,2,4] 的请求。通过使用“事件”列,我可以分两步执行操作:
- 禁用所有排序(设置 active = 0,其中 userId = $id)
- 仅激活新的(设置 active = 0,其中 userId = %id 且 listId IN (2,4)
我有以下问题:
- 有没有比使用事件标志更好的方法?我假设如果没有它,我将不得不获取旧配置,与新配置进行比较并一一更新记录,这是效率较低的。
- 如何处理更新时的新列表。在我们的例子中,已经有 5 个相关性,如果同时有人添加了第 6 个列表,并且用户想要订阅新列表,我的更新查询将不会影响第 6 个记录,因此他不会被订阅。我想我可以 UPSERT,但这在 MySQL 中不可用...
- 如果取消订阅,最好删除旧记录(1,3,5)并每次添加新记录(2,4),还是将其保留在数据库中并更改状态(从长期性能数据库角度来看)磁盘碎片)
最佳答案
在 user_id 和 list_id 组合上设置唯一索引,并在每次用户更新其列表时插入。重复插入查询将失败。因此,当用户已经订阅了该列表时,他将不会再次订阅。
但这意味着事件列必须消失,并且您无法在同一个表中保留历史记录。
关于php - MySQL:优化新闻通讯表列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39034931/