2013-01-15 2 views
5

私は同じアプリケーション内で他の3つのモデル(BCDとみなす)との限定的な外来キー関係を含むモデルAを持っています。私は、filterまたはgetやその他のクエリセット操作を使用できない一般的な外部キーの制限を知っています。Django一般的な外部キー - SQLのパフォーマンスを考慮して、良いか悪いですか?

A.objects.filter(generic_object__name="foo")私はB、C、およびDのオブジェクトを最初にクエリーセットとしてフィルタリングし、それらを反復して汎用逆リレーションを使用してAオブジェクトをリスト(クエリーセットではなく)として取得する必要があります。

クエリが直接的でないため、データベース上のSQLパフォーマンスにどのように影響するかわかりません。

PS:一般的な外部キーを使用する必要があるため、モデルの再設計ではなくSQLの改善を提案してください。

Django 1.4.3とPostgresを使用しています。

+0

"汎用の"外部キーは正確には何ですか? –

+0

ここで説明したのと同じ設定を使用しています。https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1 – Babu

答えて

7

私はデビッド・クレイマーからいくつかの単語を引用したいと思います:ディスカスの開発、Djangoのコミッタ

一般的な関係は大丈夫です。遅くはなく、コードベースで管理するのがさらに難しいです。

私は多くの人が他の人には一般的な関係を使用しないように指示していました。

+0

それは本当です。しかし、私は「コードベースを管理するのが難しい」と同意するでしょう – Babu

+2

ここには[ソース](http://www.quora.com/What-are-the-best-ways-to-improve-Django-performance) –

+0

@ ChrisVillaありがとう! – L42y

0

モデルにindex_togetherメタオプションを追加します。彼らは、レールにそれらを呼び出すよう

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

Avoid Django's GenericForeignKeyは「ポリモーフィック団体」ジェネリック外部キー(またはに関わるデータベース設計のアンチパターンの良いと徹底した説明があります-話す)。パフォーマンスに関しては

が、それは3データベースは、あなたのモデルから関連GenericForeignKeyリソースを取得するたびに問い合わせをとります

  1. はobject_id_field SELECT、OBJECT_ID myapp_aからWHERE ID = 1;
  2. SELECT app_label、モデルFROM django_content_type WHERE id = A.object_type_field;
      アプリケーションコードで
    • 、計算テーブル名model + _ + app_label
  3. TABLE_NAME FROM SELECT A.object_id_field。

一般的な外部キーにパフォーマンスの低下があると言うと、このクエリのオーバーヘッドが参照されています。

実際に汎用の外部キーを使用する必要がある環境は非常に狭いです。上にリンクされた記事はそれらについても議論します。

関連する問題