php - MySQL:优化新闻通讯表列

标签 php mysql sql database

我有 3 个表来维护我们的时事通讯订阅。

  • 第一列存储用户数据,每个数据都有唯一的 ID。
  • 第二列存储时事通讯列表(即用户可以订阅“Core 更新”和/或“提示和技巧”):

id |名称 |描述

  • 第三个表存储用户和列表之间的颜色

id |用户 ID |列表 ID |活跃

假设有 5 个可用列表,并且用户订阅了列表号 1,3 和 5。

当他将新闻通讯偏好更新为 1,2 和 4(仅限)时。我收到带有 userId 和新的列表 id 集 [1,2,4] 的请求。通过使用“事件”列,我可以分两步执行操作:

  1. 禁用所有排序(设置 active = 0,其中 userId = $id)
  2. 仅激活新的(设置 active = 0,其中 userId = %id 且 listId IN (2,4)

我有以下问题:

  1. 有没有比使用事件标志更好的方法?我假设如果没有它,我将不得不获取旧配置,与新配置进行比较并一一更新记录,这是效率较低的。
  2. 如何处理更新时的新列表。在我们的例子中,已经有 5 个相关性,如果同时有人添加了第 6 个列表,并且用户想要订阅新列表,我的更新查询将不会影响第 6 个记录,因此他不会被订阅。我想我可以 UPSERT,但这在 MySQL 中不可用...
  3. 如果取消订阅,最好删除旧记录(1,3,5)并每次添加新记录(2,4),还是将其保留在数据库中并更改状态(从长期性能数据库角度来看)磁盘碎片)

最佳答案

在 user_id 和 list_id 组合上设置唯一索引,并在每次用户更新其列表时插入。重复插入查询将失败。因此,当用户已经订阅了该列表时,他将不会再次订阅。

但这意味着事件列必须消失,并且您无法在同一个表中保留历史记录。

关于php - MySQL:优化新闻通讯表列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39034931/

相关文章:

php - Laravel:如何在 Blade 模板中获取直接配置值?

mysql - Sequelize : Or-condition over multiple tables

sql - 在 SELECT 语句中填写缺失值

php - 为 Youtube 评论投票(外部)

php - php echo 和 return 在 jQuery ajax 调用方面的区别

php - 将当前日期时间插入自定义 WordPress 日期时间列

java - Hibernate 和 MariaDB auto_increment 未通过级联正确设置 FK

php - sql 只在 mysql 中有效,在 php 中无效

SQL 循环遍历表进行计数和分组

php - 如何让PHP未定义的常量注意到错误