データベース内の1対多の関係

表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の関係も実装できます。