Django Generic Foreign keys - 考虑到SQL性能的好坏?

Bab*_*abu 8 django postgresql performance foreign-key-relationship

我有一个模型A,其中包含一个通用外键关系,其中有3个其他模型的限制选择(在同一个应用程序中将它们视为B,CD).我知道我们无法使用的通用外键的限制filterget任何其他查询集操作.

因此,为了实现这样的目的,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委员

通用关系很好.它们并不慢,在您的代码库中管理起来更加困难.

我看到很多人告诉别人不要使用通用关系,因为它很慢,但从不告诉它如何缓慢.

  • 这是[来源](http://www.quora.com/What-are-the-best-ways-to-improve-Django-performance) (2认同)

wry*_*yfi 5

避免使用Django的GenericForeignKey对涉及通用外键(或称“多态关联”,因为它们在rails-speak中称为“多态关联”)的数据库设计反模式有一个完整而完整的描述。

至于性能,每次您要从模型中检索相关的GenericForeignKey资源时,都要进行3个数据库查询:

  1. 从myapp_a中选择object_id_field,object_id,其中id = 1;
  2. 从django_content_type选择SELECT app_label,模型,其中id = A.object_type_field;
    • 在应用程序代码中,计算表名称 model + _ + app_label
  3. 选择A.object_id_field FROM TABLE_NAME;

当人们说通用外键会降低性能时,它们就是在引用此查询开销。

您只想在很小的情况下使用通用外键。以上链接的文章也对此进行了讨论。