代码之家  ›  专栏  ›  技术社区  ›  Hamid Sarfraz

用PHP和mySQL实现标签系统。救命啊!

  •  2
  • Hamid Sarfraz  · 技术社区  · 15 年前

    How to implement tag counting

    我已经实现了建议的3表标签系统完全。为了计算每个标记的文章数,我在标记定义表中使用了另一个名为tagArticleCount的列(其他列包括tagId、tagText、tagUrl、tagArticleCount)。

    如果我实现了对这个表的实时编辑,那么每当用户向文章添加另一个标记或删除一个现有标记时,tag\u definition\u表就会更新,以更新添加/删除的标记的计数器。每次进行任何修改时,都需要额外的查询(同时,标签和文章的相关链接条目也从tagLinkTable中删除。

    另一种方法是不允许对计数器进行任何实时编辑,而是使用cron在指定的时间段后更新每个标记的计数器。 这可以看作是在数据库中缓存文章计数。你能帮我找到一种方法,当一个标签被浏览时,以及当该标签的文章计数器不是最新的时,在一个列表中呈现文章吗。例如: 1.计数器显示50个项目,但实际上标签链接表中有55个条目(链接标签和项目)。

    示例中给出了如何处理这两种情况。我将使用APC来保存这些计数器的缓存。在你的解决方案中也要考虑到这一点。同时讨论实时/克隆计数器更新中的性能。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Jeffrey Blake    15 年前

    这一切都归结为您的应用程序的需要。信息的更新有多重要?在大多数情况下,我认为有实时数据的额外查询是值得的。

    实际上,我最近在开发的一个系统上遇到了同样的挑战,但最终决定使用字段存储标记计数的解决方案将不起作用。也许值得考虑一下我换一种方式的原因,以防它适用于你的情况:

    我采用的解决方案是使用计数(*),如下所示:

    SELECT count(*)
    FROM items i, categories c
    WHERE c.Id = i.Id
    AND (c.category IN ('php', 'mysql', 'tagging'))
    GROUP BY i.Id
    HAVING COUNT( i.Id )=3
    

    为了减少速度变慢的可能性,我使用AJAX来填充显示相关数据的页面段。

    推荐文章