2

マルチテーブルの継承は長期的には非常に良いアイデアではありませんが(Jacobian、​​)、ユースケースによっては、クエリ中にdjangoによって作成された「余分な結合」が価値がある。DjangoのMutiTable Vs.抽象継承

私の問題は、データベースに単一の真実の源を持っています。 Identity NumberとIdentity Typeを使用して識別されたPersonオブジェクトについて、言います。例えば。 ID番号222、タイプパスポート。

class Person(models.Model): 
    identity_number = models.CharField(max_length=20) 
    identity_type = models.IntegerField() 

class Student(Person): 
    student_number = models.CharField(max_length=20) 

class Employee(Person): 
    employee_number = models.CharField(max_length=20) 

抽象的な継承では、任意のサブクラスモデル、例えば、人抽象クラスから継承する学生、親、スーパーバイザー、従業員などは、それら全てが同じテーブルを共有しているので、私は私が作成した場合ことを確認することができ、マルチテーブル継承では、それぞれのテーブルに格納されidentity_number & identity_type

を持っていますPersonモデルの両方の列に一意の制約がある場合、はと重複しません。

抽象継承では、データベースに重複を残さないために、アプリケーションに余分な検証ロジックを組み込む必要があります。したがって、パフォーマンスがやや低下します。これは、djangoがコンクリート継承?

答えて

1

オブジェクト指向の用語でデータモデリングを考えるのは間違いです。これは、(記事で指摘されているように)パフォーマンスに大きな影響を及ぼす可能性がある非常に重要な細部を隠すことによって、リレーショナルデータベースにはあまり適していない抽象概念です(上で指摘したとおりです)。

  1. それに戻って外部キーを持つなどのID、その後Student、とPersonテーブルを持つ:あなたの例に

    伝統的なSQLのアプローチは、2つの可能性を提供します。

  2. さまざまな種類の人物を区別するための追加フィールドがあり、すべてのテーブルが1つあります。

あなたの評価が1を優先させた場合、Djangoでは具体的な継承モデルを使用することでこれを達成できることに気付くかもしれません(これはあなたが上で説明したものと同じです)。その場合、Djangoの結果として得られるアクセスパターンがよりエレガントであれば、継承を使用してください。

継承を使用してはいけないと言っているわけではありません。私は、SQLの観点からデータをモデル化した後でしか見てはいけないと言います。上記の例でこれを行った場合、抽象継承モデルで示唆されているように、すべてを別々のテーブルに分割することは決して考えられません。

+0

私はOOがリレーショナルデータベースにあまり適していないということを示すポインタが好きです。次に、データに焦点を当てて、それがどのように関連しているかを思い出させます。現在のプロジェクトでは、オプション1を使用します。 – lukik

関連する問題