Bab*_*abu 8 django postgresql performance foreign-key-relationship
我有一个模型A
,其中包含一个通用外键关系,其中有3个其他模型的限制选择(在同一个应用程序中将它们视为B
,C
和D
).我知道我们无法使用的通用外键的限制filter
或get
任何其他查询集操作.
因此,为了实现这样的目的,A.objects.filter(generic_object__name="foo")
我必须首先过滤B,C和D的对象作为查询集,迭代它们并使用通用反向关系将A
对象作为列表(而不是查询集).
我不确定它将如何影响数据库上的SQL性能,因为查询不是直接的.
PS:我需要使用通用的外键,所以请建议任何SQL改进而不是重新设计模型.
使用Django 1.4.3和Postgres.
L42*_*42y 11
我想引用David Cramer的一些话:Disqus的开发者,Django委员
通用关系很好.它们并不慢,在您的代码库中管理起来更加困难.
我看到很多人告诉别人不要使用通用关系,因为它很慢,但从不告诉它如何缓慢.
避免使用Django的GenericForeignKey对涉及通用外键(或称“多态关联”,因为它们在rails-speak中称为“多态关联”)的数据库设计反模式有一个完整而完整的描述。
至于性能,每次您要从模型中检索相关的GenericForeignKey资源时,都要进行3个数据库查询:
model + _ + app_label
TABLE_NAME
;当人们说通用外键会降低性能时,它们就是在引用此查询开销。
您只想在很小的情况下使用通用外键。以上链接的文章也对此进行了讨论。