他のレスポンダーが言ったことに加えて、サブクラステーブルの主キーに入る次のこと。
あなたのケースは、「Generalization Specialization」、または略してGen-Specとして知られているデザインパターンのインスタンスのように見えます。データベーステーブルを使用してgen-specをモデル化する方法の問題は、SOで常に発生します。
JavaなどのOOPLでgen-specをモデル化する場合は、サブクラス継承機能を使用して詳細を処理します。一般化されたオブジェクトを処理するクラスを定義してから、特殊なオブジェクトのタイプごとに1つずつ、サブクラスのコレクションを定義するだけです。各サブクラスは、一般化されたクラスを拡張します。それは簡単で簡単です。
残念ながら、リレーショナルデータモデルにはサブクラスの継承が組み込まれておらず、SQLデータベースシステムにはそのような機能はありません。しかし、あなたは運が悪いわけではありません。OOPのクラス構造に対応する方法で、gen-specをモデル化するようにテーブルを設計できます。次に、新しいアイテムが一般化されたクラスに追加されたときに、独自の継承メカニズムを実装するように調整する必要があります。詳細は以下の通りです。
クラス構造はかなり単純で、genクラス用に1つのテーブル、specサブクラスごとに1つのテーブルがあります。これは、マーティンファウラーのウェブサイトからの素敵なイラストです。 クラステーブル継承。 この図では、Cricketerはサブクラスとスーパークラスの両方であることに注意してください。どの属性をどのテーブルに入れるかを選択する必要があります。この図は、各テーブルの1つのサンプル属性を示しています。
トリッキーな詳細は、これらのテーブルの主キーをどのように定義するかです。genクラステーブルは通常の方法で主キーを取得します(このテーブルがクリケット選手のようなさらに別の一般化の特殊化である場合を除く)。ほとんどの設計者は、主キーに「Id」などの標準名を付けます。自動番号機能を使用して、Idフィールドに入力します。スペッククラステーブルは「Id」という名前の主キーを取得しますが、自動番号機能は使用されません。代わりに、各サブクラステーブルの主キーは、一般化されたテーブルの主キーを参照するように制約されます。これにより、特殊な主キーのそれぞれが、主キーだけでなく外部キーにもなります。クリケット選手の場合、IdフィールドはプレーヤーのIdフィールドを参照しますが、ボウラーのIdフィールドはクリケット選手のIdフィールドを参照することに注意してください。
これで、新しいアイテムを追加するときに、参照整合性を維持する必要があります。方法は次のとおりです。
最初に新しい行をgenテーブルに挿入し、主キーを除くすべての属性のデータを提供します。自動番号メカニズムは、一意の主キーを生成します。次に、主キーを含むすべての属性のデータを含む、新しい行を適切なスペックテーブルに挿入します。使用する主キーは、生成されたばかりの新しい主キーのコピーです。この主キーの伝播は、「貧乏人の相続」と呼ぶことができます。
これで、すべての一般化されたデータと1つのサブクラスからのすべての特殊化されたデータが必要な場合、必要なのは、共通のキーを介して2つのテーブルを結合することだけです。問題のサブクラスに関係しないすべてのデータは、結合から除外されます。それは滑らかで、簡単で、そして速いです。