2010-06-17 85 views
2

参考这篇文章:How to implement tag counting用PHP和mySQL实现标记系统。缓存帮助!

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

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

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

如何处理这两个例子中给出的scenerios。我打算使用APC来保存这些计数器的缓存。在你的解决方案中考虑它。还讨论实时/ CRONNED计数器更新中的性能。

回答

1

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

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

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

我去的解决方案是使用COUNT(*),如下所示:

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