我有一个问题,我有反对的建议,希望有更多意见。
我的站点有用户,每个用户都有一个 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/