テーブルの正規化
テーブルを分けて情報の重複をなくす作業
メリット
・データの管理が容易になる
・データ容量の削減になる
└ パフォーマンスの向上につながる
<正規化前>
▼ usersテーブル(countryカラムを含む)
id | name | country |
---|---|---|
1 | John | Japan |
2 | Emily | USA |
3 | Alex | France |
countryの値に変更が生じた場合、該当の列を全て修正しなければならない(修正が必要なデータが何十万件あったら大変)
<正規化後>
▼ usersテーブル(country_idを外部キーとして持たせる)
id | name | country_id |
---|---|---|
1 | John | 1 |
2 | Emily | 2 |
3 | Alex | 3 |
▼ countriesテーブル
id | name |
---|---|
1 | Japan |
2 | USA |
3 | France |
countryの値に変更が生じた場合、countryテーブルを修正すれば良い
テーブルの結合化
実際にデータを実際にデータを利用して何かをするときは、結合して使用する
▼ 結合されたテーブル
users.id | users.name | countries.id | countries.name |
---|---|---|---|
1 | John | 1 | Japan |
2 | Emily | 2 | USA |
3 | Alex | 3 | France |
テーブルの結合とは
テーブル同士をある条件で結合することにより、正規化なしの状態を作り出すこと
主キー(primary key)
一つの行を特定できる列のこと
usersテーブルのidは主キー
外部キー(foreign key)
他のテーブルと関連付けするための列
外部キーは関連付けされた先のテーブルでは主キーになる
リレーションシップの種類
・一対多
・多対多
・一対一
一対多
<departments テーブル>
id | name |
---|---|
1 | Sales |
2 | Marketing |
3 | Finance |
<employees テーブル>
id | name | department_id |
---|---|---|
1 | John | 1 |
2 | Emily | 1 |
3 | Alex | 2 |
4 | Sarah | 3 |
上記の例では、departmentsテーブルとemployeesテーブルが一対多の関係にあります
employeesテーブルのdepartment_idカラムをdepartmentsテーブルのidカラムに関連付けることで、各部署に所属する複数の従業員を管理することができます
多対多
<students テーブル>
id | name |
---|---|
1 | John |
2 | Emily |
3 | Alex |
<courses テーブル>
id | name |
---|---|
1 | Math |
2 | Science |
3 | History |
<student_courses テーブル(中間テーブル)>
student_id | course_id |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
上記の例では、studentsテーブルとcoursesテーブルが多対多の関係にあります
student_coursesテーブルを介して、学生とコースの関連付けを行います
一人の学生が複数のコースを履修し、同じコースに複数の学生が参加することができます
中間テーブル
中間テーブルは、多対多の関係を管理するためのテーブルです。それは、2つの異なるテーブルの間の関連を表現し、それらのテーブルのレコードを関連付けるために使用されます。中間テーブルは、多対多の関係において、関連付けを仲介し、必要なデータを正確に保存する役割を果たします。
一対一
id | name |
---|---|
1 | John |
2 | Emily |
3 | Alex |
id | user_id | bio |
---|---|---|
1 | 1 | I'm a software engineer. |
2 | 2 | I enjoy photography. |
3 | 3 | I love cooking. |
上記の例では、usersテーブルとprofilesテーブルが一対一の関係にあります
usersテーブルのidカラムとprofilesテーブルのuser_idカラムを結び付けることで、各ユーザーのプロフィール情報を取得できます
一人のユーザーに対して、一つのプロフィール情報が対応しています
※一対一のテーブルは余り見かけない。。