2012-01-14 6 views
0

私はDjangoアプリケーションを高速化しようとしています。私が気づく問題の1つは、外部キー関係の逆引き参照が効率的ではないように見えることです。このトリックはDjango ForeignKeyの検索を高速化しますか?

たとえば、教師が多くの生徒を持つことができるシナリオを想像してみましょう。ただし、生徒は1人の教師しか持てません。各学生と教師を関連付ける学生にForeignKeyを割り当てることができます。生徒用のSQLテーブルでは、teacher_idと呼ばれる列は、生徒が持つ教師を追跡します。

教師Xを持っている生徒を検索するときは、クエリセット全体を取得するためにスチューデントテーブルのすべての行をスキャンする必要がありますが、これは非効率的です。

Djangoを教えると、教師が学生に割り当てられるたびにTeacherテーブルのエントリ、たとえばstudent_id_listが更新されます。生徒のIDは他の生徒IDのコンマ区切りのリストに追加されます。

このようにして、質問が教師のすべての生徒を探しているときは、生徒を検索するためにこのコンマ区切りの生徒IDのリストを使用できます(IDは主キーです) Studentsテーブルのteacher_id列をスキャンする必要があります)。

Studentテーブルのteacher_id列は引き続き使用されます。データは2回だけ保存されます。

これは私のアプリケーションをより速くしますか?ありがとう!

+0

索引を再作成しないでください。データベースはここで起こっている種類のスキャンに最適化されています。これは、対応する生徒を取得していない場合にのみ有効です(それは非常に便利ではないと思います) – Stefano

答えて

1

あなたが理解している限り、最良のクエリパフォーマンスのためにデータベーススキームの非正規化を行いたいと思います。

ジャンゴ-組成物は、特殊なジェネリックを通じて簡単な宣言的な方法で あなたのモデルからのデータを非正規化するための抽象化の方法を提供します:ドキュメントが言ったようにdjango-composition

- この場合、私は、この目的のために特別に設計された、あなたのアプリケーションをお勧めすることができますモデル フィールドはCompositionFieldと呼ばれます。

データ非正規化のほとんどのケースはかなり一般的です。 django-compositionには、ほとんどの を扱ういくつかの「ショートカット」フィールドがあります。

CompositionFieldは、データへのインターフェイスを提供するdjangoモデルフィールドです。 非正規化。

+0

ありがとう!それが私の目標だった。 – dangerChihuahua007

2

わかりませんが、間違っているようです。何人かのIDを持つすべての生徒を得ることになります - データベースにN個のクエストがあります.Nは教師の生徒数ですが、teacher_idで生徒を除外することができます。 。
これは、DB内のインデックスから依存することができますが、それは同じになります「「学生の中から選択...」

1

をむしろ作成しない理由を、データベースに余分なメタデータを運ぶために、データベース層をハックしようとするよりも、データベース内の適切なインデックス、またはそれが役立たない場合は、ビューまたはストアドプロシージャの組み合わせを使用し、生のSQLクエリを使用して呼び出すことができますか?

関連する問題