MySQL:优化新闻稿表列

时间:2016-08-19 08:55:58

标签: php mysql sql database

我有3张表来维护我们的简报订阅。

  • 第一列存储用户数据,每个用户数据都有不同的ID。
  • 2nd colum store newsletter list(即用户可以订阅" Core 更新"和/或"提示和技巧"):

id |名字|描述

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

id | userId | listId |活性

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

当他将自己的简报偏好更新为1,2和4时(仅限)。我收到userId请求和新的列表ID [1,2,4]。使用" active"专栏,我可以分2步执行操作:

  1. 禁用所有coleration(设置active = 0,其中userId = $ id)
  2. 仅激活新的(设置为active = 0,其中userId =%id和listId IN(2,4)
  3. 我有以下问题:

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

1 个答案:

答案 0 :(得分:0)

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

但这意味着活动列必须离开,您无法在同一个表中保留历史记录。