【问题标题】:MySQL: Optimize newsletter table columnsMySQL:优化时事通讯表列
【发布时间】:2016-08-19 08:55:57
【问题描述】:

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

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

标识 |姓名 |说明

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

标识 |用户名 |列表 ID |活跃

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

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

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

我有以下问题:

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

【问题讨论】:

    标签: php mysql sql database


    【解决方案1】:

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

    然而,这意味着活动列必须消失,并且您不能在同一个表中保留历史记录。

    【讨论】:

    • 好的,取消订阅呢?删除条目?
    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 2020-03-04
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2014-11-01
    • 2013-12-15
    • 2017-10-18
    相关资源
    最近更新 更多