複数テーブルの継承と抽象ベース モデルのどちらを使用するかを決めるのに苦労しています。たとえば、大量のモデルを含む Django プロジェクトがあるとしましょう...
ビデオ、ドキュメント、画像、その他多数。
それらは、いくつかの共通のフィールドと機能を共有します。たとえば、最新の 20 個のアイテムをすべてのタイプを混在させて表示したい場合、ユーザーはこれらのコンテンツ タイプのいずれかを評価またはタグ付けできます。また、ユーザーは、複数のコンテンツ タイプを含む独自のリストを作成することもできます。
このようなもの:
BaseItem
- added
- updated
- tags
- ratings
Video(BaseItem)
Document(BaseItem)
Person(BaseItem)
これが複数テーブルの継承を使用する良いケースなのか、それとも単純に抽象基本クラスを使用する必要があるのか 疑問に思っています。
1 - マルチ テーブル継承を使用します。
つまり、すべてのタイプの最新の 20 項目を簡単に照会して表示できるということです。django-model-utils の InheritenceManager のようなものを使用して、必要に応じて正しい型を取得できます。select_related の使用には注意が必要であり、アイテムを取得するときにクエリ数を監視する必要があることは間違いありません。
2 - 抽象基本クラスを使用します。
これは、何が起こっているのかを正確に知ることでより簡単になり、単一のコンテンツタイプをクエリするだけで非常に大きなテーブルに対して JOIN を節約できるように思えますが、データベースでタイプを組み合わせることができないと思いますレベルなので、Pythonでそうする必要がありますが、これはファッジのように感じます. BaseItem だけに対する FK ではなく、複数の型に対する GFK を使用するタグ モデルも必要です。
複数テーブルの継承は、ある種の純度の観点からは正しいと思われますが、可能な限り避けるように勧めている人を見てきました。私の場合、追加の JOIN と、誰かが select_related 呼び出しを逃して足を撃つ可能性が価値があるかどうかわからないように感じます。これにより、将来問題が発生する可能性があります。
どちらの方法がより良い選択であり、その理由、またはトレードオフに関する議論を見つけることができる場所について何か考えはありますか?
ありがとう!