首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL模型优化问题

SQL模型优化问题
EN

Stack Overflow用户
提问于 2010-04-13 09:31:30
回答 3查看 78关注 0票数 0

我需要跟踪数据库中特定项目的“命中”数量。问题是,“点击”应该与用户ID保持唯一,所以如果用户点击该项目3次,它仍然应该算作点击1。

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

有没有更好的方法,而不是将每个用户对每个项目的每次点击都存储在单独的表中?将用户ID保存在逗号分隔的字符串中是一种更好、更有效的方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-13 09:37:18

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

您是否需要保留每个单独的点击(是否附加了其他信息),或者只是每个用户的计数?如果第一个为真,则使用具有thing_id和user_id列的表(加上适用于“命中”的其他属性的列)。如果第二个为真,则使用包含thing_id、user_id和hit_count列的表,并使用更新命令,如下所示:

代码语言:javascript
复制
UPDATE hit_count_table SET hit_count = hit_count + 1
   WHERE user_id = :userid AND thing_id = :thingid;
票数 1
EN

Stack Overflow用户

发布于 2010-04-13 09:46:13

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

代码语言:javascript
复制
INSERT INTO hits (user_id, thing_id) VALUES (?, ?)

因为有了索引,这要么添加一行,要么什么也不做(如果可以,您应该在定义表时指定ON CONFLICT IGNORE或等效项,这样可以避免错误)。您可以使用以下查询来获取命中次数:

代码语言:javascript
复制
SELECT COUNT(*) FROM hits WHERE thing_id = ?
票数 1
EN

Stack Overflow用户

发布于 2010-04-13 09:40:35

如果您有固定数量的项目,并且数量很小,那么您可能可以为每个项目保留一个单独的“命中”表。

如果您有很多项目(或无限数量的项目),我可能只有一个表来跟踪所有项目的命中率。如果你最终得到了很多点击记录,你可能需要重新考虑设计,这样你就可以快速查找用户,并决定是否需要插入点击记录。

总体而言,您有几种选择,它们都有性能和便利性的折衷。我只会选一个你喜欢的,然后顺其自然。你会发现什么是好的,什么是坏的,你可以把它归结为经验!

你不应该在数据库中以"CSV“字符串的形式存储东西--这是一个查询的噩梦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2626435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档