我需要跟踪数据库中特定项目的“命中”数量。问题是,“点击”应该与用户ID保持唯一,所以如果用户点击该项目3次,它仍然应该算作点击1。
此外,我还需要显示特定项目的总点击数。
有没有更好的方法,而不是将每个用户对每个项目的每次点击都存储在单独的表中?将用户ID保存在逗号分隔的字符串中是一种更好、更有效的方法吗?
发布于 2010-04-13 09:37:18
不,在数据库中用逗号分隔信息几乎永远不会更好,而且几乎总是比其他方法差得多。
您是否需要保留每个单独的点击(是否附加了其他信息),或者只是每个用户的计数?如果第一个为真,则使用具有thing_id和user_id列的表(加上适用于“命中”的其他属性的列)。如果第二个为真,则使用包含thing_id、user_id和hit_count列的表,并使用更新命令,如下所示:
UPDATE hit_count_table SET hit_count = hit_count + 1
WHERE user_id = :userid AND thing_id = :thingid;发布于 2010-04-13 09:46:13
创建一个包含列thing_id和user_id的新表hits。在thing_id和user_id上添加唯一索引。然后,您可以使用以下查询更新表:
INSERT INTO hits (user_id, thing_id) VALUES (?, ?)因为有了索引,这要么添加一行,要么什么也不做(如果可以,您应该在定义表时指定ON CONFLICT IGNORE或等效项,这样可以避免错误)。您可以使用以下查询来获取命中次数:
SELECT COUNT(*) FROM hits WHERE thing_id = ?发布于 2010-04-13 09:40:35
如果您有固定数量的项目,并且数量很小,那么您可能可以为每个项目保留一个单独的“命中”表。
如果您有很多项目(或无限数量的项目),我可能只有一个表来跟踪所有项目的命中率。如果你最终得到了很多点击记录,你可能需要重新考虑设计,这样你就可以快速查找用户,并决定是否需要插入点击记录。
总体而言,您有几种选择,它们都有性能和便利性的折衷。我只会选一个你喜欢的,然后顺其自然。你会发现什么是好的,什么是坏的,你可以把它归结为经验!
你不应该在数据库中以"CSV“字符串的形式存储东西--这是一个查询的噩梦。
https://stackoverflow.com/questions/2626435
复制相似问题