时间:2010-06-17 06:41:05

标签: php mysql performance tagging

参考这篇文章:How to implement tag counting

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

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

另一种方法是不允许对计数器进行任何实时编辑,而是使用CRON在指定的时间段后更新每个标记的计数器。 以下是我想讨论的问题。这可以看作缓存数据库中的文章计数。您可以帮我找一种方法,在探索标签时以及当该标签的文章计数器不是最新时,在列表中显示文章。例如: 1.计数器显示50篇文章,但标签链接表中有55个条目(链接标签和文章)。 2.计数器显示50篇文章,但标签链接表中有45个例外。

如何处理示例中给出的这两个场景。我将使用APC来保持这些计数器的缓存。在您的解决方案中也要考虑它。还讨论了实时/ CRONNED计数器更新中的性能。

1 个答案:

答案 0 :(得分:1)

这一切都取决于您的应用程序的需求。信息最新是多么重要?在大多数情况下,我认为额外的查询是否值得拥有实时数据。

我实际上最近在我正在开发的系统上面临同样的挑战,但最终决定使用字段存储标签计数的解决方案不起作用。如果它适用于您的情况,可能值得考虑我采用另一种方式的原因:

使用基于字段的方法,您只有一个可用的计数。对于我的系统,我希望能够提供多个级别的深度。因此,使用本文中的标签作为示例,我想知道的不仅仅是'php','mysql','best-practices','performance'和'tagging'的总体计数。我也想知道各种组合的数量。

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

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来填充显示相关数据的页面段。

相关问题