代码之家  ›  专栏  ›  技术社区  ›  mrmuggles

SQL模型优化问题

  •  0
  • mrmuggles  · 技术社区  · 15 年前

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

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

    是否有比将每个用户对每个项目的每个点击量存储在单独的表中更好的方法?将用户ID保持在用逗号分隔的字符串中是一种更好和有效的方法吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Larry Lustig    15 年前

    不,在数据库中用逗号分隔信息是 几乎 永远不会比其他选择更好,而且几乎总是比其他选择更糟糕。

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

    UPDATE hit_count_table SET hit_count = hit_count + 1
       WHERE user_id = :userid AND thing_id = :thingid;
    
        2
  •  1
  •   benzado    15 年前

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

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

    由于索引的原因,这将添加一行或不执行任何操作(如果可以,则应指定 ON CONFLICT IGNORE 或者在定义表时使用等效方法,这样可以避免错误)。您可以通过此查询获得命中数:

    SELECT COUNT(*) FROM hits WHERE thing_id = ?
    
        3
  •  0
  •   Andy White    15 年前

    如果您有一组项目,而且数量很小,那么您可能需要为每个项目保留一个单独的“命中”表。

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

    总的来说,您有几个选项,它们都有性能和便利性权衡。我只要挑一个你喜欢的就行了。你会发现什么是好的和坏的,你可以把它记在经验上!

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

    推荐文章