1

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

Tag:
   content = CharField
   creator = ForeignKey
   used = IntergerField

标签和被标记的内容之间是多对多的关系。

每次我在关联表中插入一条记录时, Tag.used都会增加一,如果删除,则减少一。

维护Tag.used是因为我想加快回答“这个标签被使用了多少次?”的问题。

但是,这似乎明显减慢了插入速度。

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

提前致谢。

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

4

2 回答 2

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')
于 2010-04-08T05:36:50.633 回答
1

如果您的数据库支持物化索引视图,那么您可能需要为此创建一个。对于聚合数据的频繁运行的查询,您可以获得很大的性能提升,我认为您在这里。

您的观点将针对以下查询:

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

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

于 2010-04-08T12:08:32.507 回答