概念レベルから始めましょう。病院、診療所、学校、大学を主題エンティティのクラスと考える場合、それらすべてを一般化するスーパークラスはありますか?おそらくあります。私はあなたと同じようにあなたの主題を理解していないので、それが何であるかをあなたに話そうとはしません。しかし、私はそれらすべてを「機関」と呼ぶことができるかのように進め、4つのそれぞれを機関のサブクラスとして扱うつもりです。
他のレスポンダーが指摘しているように、クラス/サブクラスの拡張と継承は、ほとんどのリレーショナルデータベースシステムに組み込まれていません。しかし、適切な流行語を知っていれば、多くの支援があります。以下は、データベース用語で流行語を教えることを目的としています。登場する流行語の概要は次のとおりです。「ERGeneralization」、「ER Specialization」、「Single Table Inheritance」、「Class Table Inheritance」、「SharedPrimaryKey」。
概念レベルにとどまると、ERモデリングは概念レベルでデータを理解するための良い方法です。ERモデリングには、「ER Generalization」という概念と、先ほど「スーパークラス/サブクラス」として提示した思考プロセスに対応する「ERSpecialization」という概念があります。ERスペシャライゼーションでは、サブクラスの図を作成する方法については説明していますが、サブクラスの実装方法については説明していません。
次に、概念レベルから論理レベルに移動します。リレーション、または必要に応じてSQLテーブルの観点からデータを表現します。サブクラスを実装するためのテクニックがいくつかあります。1つは「単一テーブル継承」と呼ばれます。もう1つは、「クラステーブル継承」と呼ばれます。クラステーブル継承に関連して、「共有主キー」という名前の別の手法があります。
クラステーブル継承の場合は、最初に「Institutions」というテーブルを設計します。このテーブルには、Idフィールド、nameフィールド、および4種類の機関に関係するすべてのフィールドが含まれます。たとえば、郵送先住所フィールドなど。繰り返しになりますが、あなたは私よりもデータをよく理解しており、既存の4つのテーブルすべてにあるフィールドを見つけることができます。通常の方法でidフィールドに入力します。
次に、「病院」、「診療所」、「学校」、「大学」という4つのテーブルを設計します。これらには、idフィールドに加えて、その種類の機関にのみ関連するすべてのデータフィールドが含まれます。たとえば、病院には「病床数」があるかもしれません。繰り返しになりますが、あなたは私よりもあなたのデータをよく理解しており、Institutionsテーブルに含まれていなかった既存のテーブルのフィールドからこれらを理解することができます。
ここで「共有主キー」が登場します。「機関」に新しいエントリが作成されると、4つの特殊なサブクラステーブルの1つに新しい並列エントリを作成する必要があります。ただし、idフィールドに入力するために、ある種の自動番号機能は使用しません。代わりに、「Institutions」テーブルのidフィールドのコピーをサブクラステーブルのidフィールドに配置します。
これは少し作業ですが、メリットは努力する価値があります。共有主キーは、サブクラスエントリとスーパークラスエントリ間の関係の1対1の性質を強制します。これにより、スーパークラスデータとサブクラスデータの結合が簡単、簡単、高速になります。これにより、特定の機関がどのサブクラスに属しているかを示す特別なフィールドが不要になります。
そして、あなたの場合、それはあなたの元の質問に対する便利な答えを提供します。あなたが最初に尋ねていた外部キーは、今では常に機関テーブルへの外部キーです。また、shared-primary-keyの魔法により、外部キーは適切なサブクラステーブルのエントリも参照し、余分な作業は必要ありません。
便宜上、機関データを4つのサブクラステーブルのそれぞれと組み合わせる4つのビューを作成できます。
「ERスペシャライゼーション」、「クラステーブル継承」、「共有主キー」、そしておそらく「単一テーブル継承」をWebで、そしてここではSOで検索してください。ここSOには、これらの概念または手法のほとんどのタグがあります。