SQL模型优化问题

时间:2010-04-13 01:31:30

标签: sql model

我需要跟踪数据库中特定项目的“点击次数”。 问题是“点击”应该与用户ID保持唯一,因此如果用户点击该项目3次,它仍应计入点击次数。

另外,我需要显示特定项目的总点击次数。

有没有比在单独的表中为每个用户存储每个项目的每个匹配更好的方法?将用户ID保存在以逗号分隔的字符串中是一种更好,更有效的方法吗?

3 个答案:

答案 0 :(得分:1)

不,在数据库中用逗号分隔信息几乎永远不会更好,而且几乎总是比替代品差得多。

您是否需要保持每个人的命中(附加了附加信息),还是每个用户的计数?如果第一个为true,则使用带有thing_id和user_id列的表(以及适用于“hit”的其他属性的列)。如果第二个为true,则使用带有thing_id,user_id和hit_count列的表,并使用UPDATE命令,如:

UPDATE hit_count_table SET hit_count = hit_count + 1
   WHERE user_id = :userid AND thing_id = :thingid;

答案 1 :(得分:1)

使用列thing_id和user_id创建一个新表hits。在thing_id和user_id上添加UNIQUE索引。然后,您可以使用此查询更新表:

INSERT INTO hits (user_id, thing_id) VALUES (?, ?)

由于索引,它将添加一行或不执行任何操作(如果您可以在定义表时指定ON CONFLICT IGNORE或等效项,则可以避免错误)。您可以使用此查询获取点击次数:

SELECT COUNT(*) FROM hits WHERE thing_id = ?

答案 2 :(得分:0)

如果你有一定数量的物品,且数量很少,你可能会为每件物品保留一个单独的“命中”表。

如果你有很多物品(或无限数量的物品),我可能只有一张表来跟踪所有物品的点击量。如果最终得到大量的点击记录,您可能需要重新考虑设计,以便快速查找用户,并决定是否需要插入点击记录。

总的来说,您有多种选择,它们都有性能和便利性权衡。我只选择你喜欢的一个,然后继续使用它。你会发现什么是好的和坏的,你可以把它用来体验!

您永远不应该将数据库中的内容存储为“CSV”字符串 - 这是一个完整的查询噩梦。