簡體   English   中英

Django Generic Foreign keys - 考慮到SQL性能的好壞?

[英]Django Generic Foreign keys - Good or Bad considering the SQL performance?

我有一個模型A ,它包含一個通用的外鍵關系,在同一個應用程序中有3個其他模型(將它們視為BCD )的限制選擇。 我知道通用外鍵的局限性,我們不能使用filterget或任何其他查詢集操作。

所以要實現這樣的東西, A.objects.filter(generic_object__name="foo")我必須首先過濾B,C和D的對象作為查詢集,迭代它們並使用通用反向關系將A對象作為列表(不是查詢集)。

我不確定它將如何影響數據庫上的SQL性能,因為查詢不是直接的。

PS:我需要使用通用的外鍵,所以請建議任何SQL改進而不是重新設計模型。

使用Django 1.4.3和Postgres。

我想引用David Cramer的一些話:Disqus的開發者,Django委員

通用關系很好。 它們並不慢,在您的代碼庫中管理起來更加困難。

我看到很多人告訴別人不要使用通用關系,因為它很慢,但從不告訴它如何緩慢。

避免Django的GenericForeignKey對通用外鍵中涉及的數據庫設計反模式(或“多態關聯”,如他們稱之為rails-speak)進行了詳盡而詳盡的描述。

至於性能,每次要從模型中檢索相關的GenericForeignKey資源時,它需要3個數據庫查詢:

  1. SELECT object_id_field,來自myapp_a的object_id WHERE id = 1;
  2. SELECT app_label,model FROM django_content_type WHERE id = A.object_type_field;
    • 在應用程序代碼中,計算表名model + _ + app_label
  3. TABLE_NAME選擇A.object_id_field;

當人們說通用外鍵具有性能損失時,他們會引用此查詢開銷。

只有非常狹窄的環境,您真正想要使用通用外鍵。 上面鏈接的文章也討論了這些內容。

在模型中添加index_together Meta選項:

class Meta:
    index_together = [('cprofile_id', 'cprofile_type')]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM