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

1対多 データベース内の関係 表Aの各レコードが表Bに多数のリンクされたレコードを持っている可能性があるが、表Bの各レコードが表Aに対応するレコードを1つだけ持っている場合に発生します。

データベース内の1対多の関係は、最も一般的なリレーショナルデータベースの設計であり、優れた設計の中心です。

データベースは、 1対1の関係 そして多対多の関係。

サーバールームにいる人。

エリックイサクソン/ゲッティイメージズ

1対多の関係の例

教師と彼らが教えるコースとの関係を考えてみてください。 教師は複数のクラスを教えることができますが、コースは教師と同じ関係にはなりません。

したがって、Teachersテーブルの各レコードについて、Coursesテーブルには多くのレコードが存在する可能性があります。 この例は、1対多の関係を示しています。1人の教師と複数のコースです。

1対多の関係を確立することが重要である理由

1対多の関係を表すには、少なくとも2つのテーブルが必要です。 理由を見てみましょう。

第一正規形設計の順守

おそらく、教えられた名前とコースを記録したいテーブルを作成しました。 次のようにTeachersandCoursesテーブルを設計する場合があります。

Teacher_ID 教員名 コース
Teacher_001 カルメン 生物学
Teacher_002 ベロニカ 算数
Teacher_003 ホルヘ 英語

カルメンが2つ以上のコースを教えている場合はどうなりますか? この設計には2つのオプションがあります。 次のように、カルメンの既存のレコードに追加できます。

Teacher_ID 教師_名前 コース
Teacher_001 カルメン 生物学、数学
Teacher_002 ベロニカ 算数
Teacher_003 ホルヘ 英語

ただし、上記の設計は柔軟性がなく、後でデータを挿入、編集、または削除するときに問題が発生する可能性があります。 データの検索が難しくなります。

この設計は、データベースの正規化の第一原理にも違反しています。 第一正規形(1NF)、これは、各テーブルセルに単一の個別のデータを含める必要があることを示しています。

2番目の正規形ルール

別の設計代替案は、カルメンの2番目のレコードを追加することです。

教師_ID 教師_名前 コース
Teacher_001 カルメン 生物学
Teacher_001 カルメン 算数
Teacher_002 ベロニカ 算数
Teacher_003 ホルヘ 英語

このアプローチは1NFに準拠していますが、冗長性が導入され、大規模なデータベースが不必要に肥大化する可能性があるため、データベース設計は依然として不十分です。 さらに重要なことに、データに一貫性がなくなる可能性があります。

たとえば、カルメンの名前が変わったらどうなるでしょうか。 データを操作している人が、1つのレコードで自分の名前を更新し、2番目のレコードで名前を更新できない可能性があります。

このデザインは違反しています 第2正規形(2NF) 標準。1NFに準拠し、複数のレコードの冗長性も回避する必要があります。 2NFルールは、データのサブセットを複数のテーブルに分割し、それらの間に関係を作成することによってこれを実現します。

1対多の関係を持つデータベースを設計する方法

Teachers and Coursesテーブルに1対多の関係を実装するには、テーブルを2つに分割し、 外部キー.

ここでは、TeachersテーブルのCourse列を削除しました。

教師_ID 教師_名前
Teacher_001 カルメン
Teacher_002 ベロニカ
Teacher_003 ホルヘ

そして、これがコーステーブルです。 その外部キーTeacher_IDは、コースをTeachersテーブルの教師にリンクしていることに注意してください。

Course_ID コース名 Teacher_ID
Course_001 生物学 Teacher_001
Course_002 算数 Teacher_001
Course_003 英語 Teacher_003

外部キーを使用して、TeachersとCoursesテーブルの関係を構築しました。 この配置は、カルメンが生物学と数学の両方を教えており、ホルヘが英語を教えていることを示しています。

この設計がどのように冗長性を回避し、個々の教師が複数のコースを教えることを可能にし、1対多の関係を実装するかを見ることができます。