ERダイアグラムのISAリレーションシップがデータベースのテーブルにどのように変換されるのか、単に疑問に思っていました。
3つのテーブルがありますか?一人用、学生用、そして教師用?
それとも2つのテーブルがありますか? 1つは生徒用、もう1つは教師用であり、各エンティティは個人+自分の属性を持っていますか?
それとも、4つの属性すべてを備えた1つのテーブルがあり、その行の生徒か教師かによって、テーブル内の四角形の一部がnullになるのでしょうか。
注:これを追加するのを忘れていましたが、ISAの関係は完全にカバーされているため、生徒は教師か教師でなければなりません。
関係が必須である(あなたが言ったように、人hasが学生または教師である)と素である(人は学生または教師のいずれかですが、両方ではない)と仮定すると、最良の解決策は生徒用と教師用の2つのテーブルがあります。
参加が代わりにオプションである場合(これはあなたのケースではありませんが、完全にするために入れましょう)、3つのテーブルオプションは、Person(PersonID、Name)テーブルと、次に参照する他の2つのテーブルを使用する方法ですPersonテーブル、例えばStudent(PersonID、GPA)。PersonIDはPKおよびFKはPerson(PersonID)を参照します。
1テーブルオプションはおそらくここでの最良の方法ではなく、null値を持つ複数のレコードが生成されます(人が学生の場合、教師のみの属性はnullになり、その逆も同様です)。
バラバラさが違うなら、それは別の話です。
これをERにマッピングするために使用できる4つのオプションがあります。
オプション1
オプション2これはカバー関係であるため、オプション2は適していません。
オプション
オプション4
サブクラスには多くの属性がないので、オプション3とオプション4はこれをERにマップすることをお勧めします
この回答はコメントだったかもしれませんが、わかりやすくするためにここに掲載します。
選択した回答で対処できなかったいくつかの点に対処したいと思います。「2つのテーブル」の設計の結果について、もう少し詳しく説明します。
データベースの設計は、アプリケーションのスコープと、実行する関係とクエリのタイプによって異なります。たとえば、2つのタイプのユーザー(学生と教師)がいて、タイプに関係なく、すべてのユーザーが参加できる一般的な関係がたくさんある場合、2つのテーブルの設計は、多くの「重複」する可能性があります。関係(ユーザーが異なるニュースレターを購読できるように、「ユーザー」とニュースレターの間に1つのM2M関係テーブルを用意する代わりに、その関係を表すために2つの別々のテーブルが必要になります)。 2人ではなく3人の異なるタイプのユーザーがいる場合、または階層内に追加のIsAレイヤーがある場合(パートタイム対フルタイムの学生)、この問題は悪化します。
考慮すべきもう1つの問題-実装する制約のタイプ。ユーザーが電子メールを持っていて、電子メールに対してユーザー全体の一意の制約を維持したい場合、2つのテーブルの設計の実装はトリッキーです。一意ごとに 追加のテーブル を追加する必要があります。制約。
考慮すべきもう1つの問題は、一般的に単なる重複です。ユーザーに新しい共通フィールドを追加する場合は、複数回行う必要があります。その共通フィールドに一意制約がある場合は、その一意制約用の新しいテーブルも必要になります。
これはすべて、2つのテーブルのデザインが適切なソリューションではないということではありません。構築している関係、クエリ、機能の種類に応じて、ほとんどの設計決定の場合と同様に、一方の設計をもう一方の設計よりも選びたい場合があります。
それは関係の性質に完全に依存します。
個人と学生の関係が1対N(1対多)の場合、正しい方法は、学生が個人のID主キー列に戻る外部キーを持つ外部キー関係を作成することです。人と教師の関係についても同様です。
ただし、リレーションシップがMからN(多対多)の場合は、それらのリレーションシップを含む別のテーブルを作成する必要があります。
ERDが1対Nの関係を使用すると想定すると、テーブル構造は次のようになります。
CREATE TABLE Person(sin bigint、name text、PRIMARY KEY(sin));
CREATE TABLE Student(GPA float、fk_sin bigint、FOREIGN KEY(fk_sin)REFERENCES Person(sin));
teacherテーブルについても同じ例に従います。このアプローチでは、ほとんどの場合、第3正規形を使用できます。