设计一个Tag表,告诉它使用了多少次

时间:2010-04-08 05:25:05

标签: python django database-design tagging

我正在尝试使用这样的模型设计标记系统:

Tag:
   content = CharField
   creator = ForeignKey
   used = IntergerField

这是标签与标签之间的多对多关系。

每次我将记录插入到分配表中,   Tag.used 加1,如果删除则递减1。

保留了

Tag.used ,因为我想加快回答“此标记使用了多少次?”的问题。

但是,这似乎显然会减慢插入速度。

请告诉我如何改进这种设计。

提前致谢。

http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html

2 个答案:

答案 0 :(得分:1)

我不认为像这样对数据进行非规范化是个好主意。

我认为更优雅的解决方案是使用django聚合来跟踪标记的使用次数http://docs.djangoproject.com/en/dev/topics/db/aggregation/

您可以通过调用以下内容将已使用的计数附加到标记对象:

my_tag = Tag.objects.annotate(used=Count('post'))[0]

然后像这样访问它:

my_tag.used

假设您的Post模型类具有Tag类的ManyToMany字段

如果需要,您可以通过指定的注释字段订购标签:

Tag.objects.annotate(used=Count('post')).order_by('-used')

答案 1 :(得分:1)

如果您的数据库支持materialized indexed views,那么您可能需要为此创建一个。对于经常运行的聚合数据的查询,您可以获得很大的性能提升,我认为您已经在这里了。

您的观点将出现在以下查询中:

SELECT
    TagID,COUNT(*)
    FROM YourTable
    GROUP BY TagID

聚合可以预先计算并存储在索引中,以最大限度地减少查询执行期间的昂贵计算。