我正在尝试使用这样的模型设计标记系统:
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
答案 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
聚合可以预先计算并存储在索引中,以最大限度地减少查询执行期间的昂贵计算。