データベース内の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対多の関係を実装するかを見ることができます。