表Aの各レコードが表Bに多数のリンクされたレコードを持つ場合、表Bの各レコードは表Aの対応するレコードを1つしか持たない場合、データベース内の1対多の関係が発生します 。データベースは最も一般的なリレーショナルデータベース設計であり、優れた設計の中心にあります。
教師と彼らが教えるコースの関係を考えてみましょう。 教師は複数のコースを教えることができますが、コースは教師と同じ関係にはありません。
したがって、Teachersテーブルの各レコードについて、コーステーブルには多くのレコードが存在する可能性があります。 これは1対1の関係で、1人の教師が複数のコースになります。
1対多の関係を確立することが重要な理由
1対多の関係を表すには、少なくとも2つのテーブルが必要です。 なぜか見てみましょう。
おそらく、教師の名前とコースを記録したいと思っていたTeachersのテーブルを作成しました。 私たちはこれを次のように設計するかもしれません:
教師_ID | 先生の名前 | コース |
---|---|---|
Teacher_001 | カルメン | 生物学 |
Teacher_002 | ヴェロニカ | 数学 |
Teacher_003 | ホルヘ | 英語 |
カルメンが2つ以上のコースを教えたら? このデザインには2つの選択肢があります。 これをCarmenの既存のレコードに追加することができます:
教師_ID | Teacher _Name | コース |
---|---|---|
Teacher_001 | カルメン | 生物学、数学 |
Teacher_002 | ヴェロニカ | 数学 |
Teacher_003 | ホルヘ | 英語 |
しかし、上記の設計は柔軟性がなく、後でデータの挿入、編集、または削除を試みるときに問題を引き起こす可能性があります。
それはデータを検索することが困難になります。 この設計は、データベースの正規化の第1原則であるFirst Normal Form(1NF)に違反しています。これは、各表のセルに単一の個別のデータが含まれている必要があることを示しています。
別のデザインの選択肢は、カルメンの2番目のレコードを単純に追加することです。
教師 _ID | Teacher _Name | コース |
---|---|---|
Teacher_001 | カルメン | 生物学 |
Teacher_001 | カルメン | 数学 |
Teacher_002 | ヴェロニカ | 数学 |
Teacher_003 | ホルヘ | 英語 |
これは1NFに準拠していますが、冗長性を導入し、非常に大きなデータベースを不必要に膨らませる可能性があるため、依然としてデータベース設計が貧弱です。 さらに重要なことに、データが矛盾する可能性があります。 たとえば、カルメンの名前が変更された場合はどうなりますか? データを扱う誰かが1つのレコードで自分の名前を更新し、2番目のレコードでその名前を更新できない場合があります。 この設計は、1NFに準拠する第2正規形(2NF)に違反し、データのサブセットを複数の表に分割し、それらの間に関係を作成することによって、複数のレコードの冗長性を避けなければなりません。
1対多の関係を持つデータベースを設計する方法
Teachers and Coursesテーブルに一対多の関係を実装するには、テーブルを2つに分割し、 外部キーを使用してリンクします 。
ここでは、TeachersテーブルのCourse列を削除しました。
教師 _ID | Teacher _Name |
---|---|
Teacher_001 | カルメン |
Teacher_002 | ヴェロニカ |
Teacher_003 | ホルヘ |
そして、コーステーブルがあります。 その外部キー、Teacher_IDは、Teachersテーブルの教師にコースをリンクしています。
Course_ID | コース名 | 教師_ID |
---|---|---|
Course_001 | 生物学 | Teacher_001 |
Course_002 | 数学 | Teacher_001 |
Course_003 | 英語 | Teacher_003 |
外部キーを使用して、教師とコースのテーブルの関係を作成しました。
これは生物学と数学の両方がカルメンによって教えられ、ホルヘが英語を教えることを教えてくれます。
このデザインがどのような冗長性を回避し、個々の教師が複数のコースを教えることができ、1対多の関係をどのように実現するかがわかります。
データベースは、1対1の関係と多対1の関係も実装できます。