[英]Django Generic Foreign keys - Good or Bad considering the SQL performance?
我有一個模型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。
我想引用David Cramer的一些話:Disqus的開發者,Django委員
通用關系很好。 它們並不慢,在您的代碼庫中管理起來更加困難。
我看到很多人告訴別人不要使用通用關系,因為它很慢,但從不告訴它如何緩慢。
避免Django的GenericForeignKey對通用外鍵中涉及的數據庫設計反模式(或“多態關聯”,如他們稱之為rails-speak)進行了詳盡而詳盡的描述。
至於性能,每次要從模型中檢索相關的GenericForeignKey資源時,它需要3個數據庫查詢:
model + _ + app_label
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.