MySQL:用户 "views"的表结构

标签 mysql unique-constraint primary-key

我有一个问题,我有反对的建议,希望有更多意见。

我的站点有用户,每个用户都有一个 user_id。这些用户可以查看产品,我需要跟踪用户查看特定产品的独特实例。要在单独的 View 表中记录 View ,我目前有两种选择:

选项 1:

view_id (INT,PK) | user_id (INT,FK) | product_id (INT,FK) |查看日期

... 并在两个中间列上创建一个唯一约束,以便使用 ON DUPLICATE KEY 轻松更新。如果相同的 View 已经存在,我只更新 view_date。如果没有,我会写一个新行。

选项 2:

用户产品 (VARCHAR20,PK) |查看日期

... 将两个id合并成一个中间有分隔符的VARCHAR,使用主键列,方便用ON DUPLICATE KEY更新,方法同上。

该结构最多可容纳大约万独特的意见。关于哪个选项可能更好或更差的任何想法,为什么?非常感谢。

编辑: 感谢您的回答,似乎达成了共识。倾向于同一侧,但只需要安慰。

最佳答案

我更喜欢第一个选项——一般来说,保持尽可能多的原子性是好的。如果你想查询所有用户的 View ,或类似的东西,在将两列合并为一列之后会更难做(你需要使用 LIKE 和通配符匹配,它永远不会像索引单值列一样快)。您还会失去在不同字段上编制索引的能力。

此外,没有理由不能拥有涉及多列的主键或唯一键,所以我认为选项 2 没有任何优势。要执行更新,只需使用 REPLACE ( documentation )而不是 INSERT - 这将使您能够轻松维护每个用户/产品组合只有一行的不变量。

关于MySQL:用户 "views"的表结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2037715/

相关文章:

java - JSP 未运行

mysql - 当第一种情况发生时,Sql 两个多线程唯一忽略

python - 根据重复提取一定数量的行?

primary-key - 用于雪花批量加载的 AUTOINCREMENT 主键

sql - 如何在没有序列的情况下自动增加 SQL Server 2016 合并插入中的主键?

MySql 索引排序和位置

mysql - 如何在 feathersjs 的 yeoman 生成的配置中设置 mysql 密码

php - 从 MySQL 检索值

unique-constraint - VoltDB 支持唯一索引吗?

MYSQL 允许我在 PK 和 FK 中插入空值