koheitakahashiのブログ

2020.07.01にプログラマーとして生を受けた私が学んだことや、日常について徒然に書いていきます。

中間テーブルとは?

はじめに

今日、fjordbootcampの課題であるTwitterのER図についてOKを頂けました😆

課題を進めていく中で悩んだ中間テーブルという概念について自分なりにまとめてみたいと思います。

多対多の関係とは

中間テーブルの概念を説明する前に多対多の関係について説明する必要があると思います。

多対多の関係についてですが、これはエンティティ同士の関係を表したものです。

エンティティAに含まれる項目が、複数のエンティティBの項目を持つことがあり、逆にエンティティBの項目についても、複数のエンティテAの項目を持つという関係のことです。

言葉にするとややこしくなってしまいました💦 図1で簡単に説明させてください。

これは、ある学校の選択科目を管理するデータベースだとします。これには、生徒エンティティと教科エンティティがあり、どの生徒がどの科目を選んでいるかが分かるように管理されています。

例えば、「深沢諭吉」は国語と体育を選択しています。

また、これは逆のことも言えると思います。「国語」から見たら「深沢諭吉」と「樋口二葉」が選択しています。

図1

f:id:NMP300:20190924194526j:plain
多対多の関係

このように、エンティティAに含まれる項目が、エンティティBの複数の項目と関係があり、逆にエンティティBの項目が複数のエンティティAの項目と関係があることを多対多の関係と呼びます。

多対多の問題とは

ここで、多対多の関係には問題があります。それは、各エンティティが共通の項目を持たないため、一緒に見ることはできないということです。

どういうことかというと、無理やりに教科エンティティと生徒エンティティをくっつけると、以下の図のように、生徒エンティティに同じ生徒が2人以上いることになってしまい、データがおかしくなってしまいます💦

図2

f:id:NMP300:20190924194640j:plain
多対多の関係の問題点

中間テーブルとは

そこで、中間テーブルの登場です。中間テーブルは両方のテーブルのキーを持ち、それらを管理することで、上記の問題を解決しようと試みます。

つまりどいういうことかというと、以下の図のように中間テーブルである「受講テーブル」は、生徒ID、教科名IDを管理しています。

こうすることで、生徒エンティティと受講テーブルの関係は1対 多の関係。教科エンティティと受講テーブルの関係も1対多の関係になります。(深沢諭吉がどの科目を選択しているかを見たいときは、受講テーブルを参照すればよいため)

図3

f:id:NMP300:20190924194606j:plain
中間テーブルの登場

このようにして、中間テーブルによって、多対多の関係が1対多の関係にすることができ、2つのエンティティの情報を一緒に見ることが可能になりました。

最後に

無事にデータベース設計のプラクティスが終わり、次はSinatraのプラクティスに入っていきます。 データベース設計は、難しく頻繁に手が止まり考え込んでいましたが、なんとかクリアできて嬉しいです😆