0

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

我的网站有用户,每个用户都有一个 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 轻松更新。

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

编辑: 感谢您的回答,似乎有一个共识。向同一侧倾斜,但只需要保证。

4

3 回答 3

2

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

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

于 2010-01-10T17:01:27.717 回答
1

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

于 2010-01-10T17:03:26.387 回答
1

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

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

于 2010-01-10T17:06:26.043 回答