2010-04-13 95 views
0

我需要跟踪数据库中特定项目上的“点击次数”。 事情是,“命中”应该保持唯一与用户ID,所以如果用户点击该项目3次,它应该仍然计为1命中。SQL模型优化问题

此外,我需要显示总数对特定物品的点击次数。

是否有更好的方法比单独的表中存储每个用户每个项目的每个匹配项?将用户标识保存在一个由逗号分隔的字符串中是一种更好且有效的方式?

回答

1

不,保留以逗号分隔的数据库中的信息是差不多永远不会更好,并且几乎总是比备选方案差很多很多。

你是否需要保持每个单独的命中(是否有附加的信息),或者只是每个用户的计数?如果第一个为true,则使用带有thing_id和user_id列的表(加上适用于“hit”的其他属性的列)。如果第二个是真实的,使用一个表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; 
+0

好吧其实我并不需要跟踪“的总点击量”,只有“通过用户唯一命中”,所以我想这它会只是一个表thing_id和user_id ..每个命中将不得不“插入命中”和“失败优雅,如果已经存在”我想:)谢谢 – mrmuggles 2010-04-13 01:40:55

+0

我觉得supermogx希望“唯一访问者数”而不是“每用户点击数”,这就是你用那个UPDATE语句记录的内容。 – benzado 2010-04-13 01:41:27

+0

@benzado:exactly;) – mrmuggles 2010-04-13 01:56:24

0

如果你有一个项目的一组号码,且数量少,你很可能得到为每件商品保留一个单独的“Hit”表。

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

总的来说,你有几个选择,他们都有性能和便利的折衷。我只是选择一个你喜欢的,并与它一起去。你会发现什么是好的和坏的,你可以把它记录下来体验!

你不应该把东西作为“CSV”字符串存储在数据库中 - 这是一个完整的查询噩梦。

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 = ?