Skip to main content

データベースにおける一対多の関係

Anonim

表Aの各レコードが表Bに多数のリンクされたレコードを持つ場合、表Bの各レコードは表Aの対応するレコードを1つしか持たない場合、データベース内の1対多の関係が発生します。データベースは最も一般的なリレーショナルデータベース設計であり、優れた設計の中心にあります。

教師と彼らが教えるコースの関係を考えてみましょう。教師は複数のコースを教えることができますが、コースは教師と同じ関係にはありません。

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

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

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

たぶん私たちは教えられた名前とコースを記録したいテーブルを作成しました。私たちはこれを次のように設計するかもしれません:

教師とコース
教師_ID教員名コース
Teacher_001カルメン生物学
Teacher_002ヴェロニカ数学
Teacher_003ホルヘ英語

カルメンが2つ以上のコースを教えたら?このデザインには2つの選択肢があります。これをCarmenの既存のレコードに追加することができます:

教師とコース
教師_ID先生_名コース
Teacher_001カルメン生物学、数学
Teacher_002ヴェロニカ数学
Teacher_003ホルヘ英語

しかし、上記の設計は柔軟性がなく、後でデータの挿入、編集、または削除を試みるときに問題を引き起こす可能性があります。

それはデータを検索することが困難になります。この設計は、データベースの正規化の第1原則であるFirst Normal Form(1NF)に違反しています。これは、各表のセルに単一の個別のデータが含まれている必要があることを示しています。

別のデザインの選択肢は、カルメンの2番目のレコードを単純に追加することです。

教師とコース
先生_ID先生_名コース
Teacher_001カルメン生物学
Teacher_001カルメン数学
Teacher_002ヴェロニカ数学
Teacher_003ホルヘ英語

これは1NFに準拠していますが、冗長性を導入し、非常に大きなデータベースを不必要に膨らませる可能性があるため、依然としてデータベース設計が貧弱です。さらに重要なことに、データが矛盾する可能性があります。たとえば、カルメンの名前が変更された場合はどうなりますか?データを扱う誰かが1つのレコードで自分の名前を更新し、2番目のレコードでその名前を更新できない場合があります。この設計は、1NFに準拠する第2正規形(2NF)に違反し、データのサブセットを複数の表に分割し、それらの間に関係を作成することによって、複数のレコードの冗長性を避けなければなりません。

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

Teachers and Coursesテーブルに一対多の関係を実装するには、テーブルを2つに分割し、外部キーを使用してリンクします。

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

教師
先生_ID先生_名
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の関係も実装できます。