【问题标题】:MySQL: Table structure for a user's "views"MySQL:用户“视图”的表结构
【发布时间】:2010-01-10 16:58:51
【问题描述】:

我有一个问题,我有反对意见,希望能提供更多意见。

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

选项 1:

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

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

选项 2:

user_product (VARCHAR20,PK) |查看日期

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

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

编辑: 谢谢大家的回答,好像有共识了。倾向于同一侧,但只是需要安慰。

【问题讨论】:

    标签: mysql unique-constraint primary-key


    【解决方案1】:

    我更喜欢第一个选项 - 一般来说,保持尽可能多的原子性是件好事。如果您想查询所有用户的视图或类似的东西,在将两列合并为一列后会更难(您需要使用带有通配符匹配的LIKE,这永远不会像快作为索引单值列)。您也失去了在不同字段上建立索引的能力。

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

    【讨论】:

    • 是的......虽然我的理解是 REPLACE “花费”了一个自动递增的 INT id(因为它是删除然后重写),所以 PK 列数据类型需要适应它。
    【解决方案2】:

    我认为第一个选项是您更好的选择。后来我认为这将使查询不同的东西变得更容易一些。查询也可能会更快,因为不涉及字符串操作。此外,如果需要,您可以在多个列上使用主键。

    【讨论】:

      【解决方案3】:

      绝对选择第一个选项。如果您需要生成报告以查找特定的用户组,第二个选项将意味着来自地狱的许多查询(让我所有经常查看产品 X 和产品 Y 的用户,以便我们可以为他们提供折扣),对于查找特定组也是如此产品数量(哪些产品经常被同一用户查看,因此我们可以推出折扣促销)

      我了解不需要记住所有个人观点。但我肯定会记录他们访问产品的次数 - 这几乎是免费的,因为您可以保持一个运行总数(插入 1 ,重复键更新 view_count = view_count + 1)

      【讨论】:

      • view_count...谢谢,虽然我现在不需要它,但可能会添加它,好建议。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多