はじめに
データベースの正規化についてまとめてみました
データベースの正規化とは
データベースの正規化とはデータの重複をなくし、データの更新に適したテーブルとなるように整理する作業の事を言います
正規化していない例
employeesテーブル
| id | name | department |
|---|---|---|
| 1 | 田中 | 開発部 |
| 2 | 高山 | 開発部 |
| 3 | 佐藤 | 営業部 |
| 4 | 梓沢 | 開発部 |
上のemployeesテーブルの開発部という部署名がアプリケーション開発部に変更になったとすると
| id | name | department |
|---|---|---|
| 1 | 田中 | アプリケーション開発部 |
| 2 | 高山 | アプリケーション開発部 |
| 3 | 佐藤 | 営業部 |
| 4 | 梓沢 | アプリケーション開発部 |
1行ずつ変更しなければいけない
正規化している例
emplyeesテーブルとdepartmentsテーブルと分ければ変更が1箇所のみで済む
employeesテーブル
| id | name | department_id |
|---|---|---|
| 1 | 田中 | 1 |
| 2 | 高山 | 1 |
| 3 | 佐藤 | 2 |
| 4 | 梓沢 | 1 |
departmentsテーブル
| department_id | department_name |
|---|---|
| 1 | 開発部 → アプリケーション開発部 |
| 2 | 営業部 |
| 3 | 経理部 |
| 4 | 総務部 |
このように、データ更新の際に複数行のデータを更新しなくてはいけないような構造を、1箇所の更新で済むように変える作業を正規化と言います
データベースの正規化で出てくる用語
データベースの正規化では以下の4つのキーワードがよく出てくる
従属
データベースの正規化において、従属するというのは、特定の関連性や依存関係を指します。
具体的には、データベースのテーブルの中で、ある属性(列)が他の属性に従属しているということを意味します。
従属している例
この場合、gradesテーブルのstudent_idはstudentsテーブルのstudent_idに従属しています。
特定のgradesレコードは一意の学生に紐づいており、異なるstudent_idの成績には影響を与えません。
studentsテーブル
| student_id | student_name | birth_date | department |
|---|---|---|---|
| 1 | 山田太郎 | 2000-05-10 | 工学部 |
| 2 | 田中花子 | 1999-12-25 | 文学部 |
| 3 | 佐藤健太 | 2001-08-02 | 経済学部 |
| 4 | 鈴木美咲 | 2002-03-15 | 法学部 |
gradesテーブル
| grade_id | student_id | subject | score |
|---|---|---|---|
| 1 | 1 | マクロ経済学入門 | 85 |
| 2 | 1 | English Conversation | 78 |
| 3 | 2 | 日本文学入門 | 92 |
| 4 | 3 | マクロ経済学入門 | 79 |
| 5 | 3 | English Conversation | 88 |
| 6 | 3 | 力学入門 | 70 |
| 7 | 4 | 基礎化学 | 91 |
主キー
主キーとはデータベースの項目に設定されるもので、設定した項目データを一意に識別するために使われるものとなります。
Primary Keyとも言ったりします。
つまりは主キーを設定すれば重複するデータ、同じデータがテーブル上には存在しなくなるということ
主キーが設定されている例
customersテーブル
customer_idが主キー
| customer_id | customer_name | tel_number | address |
|---|---|---|---|
| 1001 | 山田太郎 | 010-0000-0000 | 東京都 |
| 1002 | 田中花子 | 020-0000-0000 | 大阪府 |
| 1003 | 佐藤健太 | 030-0000-0000 | 福岡県 |
| 1004 | 鈴木美咲 | 040-0000-0000 | 北海道 |
候補キー
候補キーとは主キーになりえる項目のことを言います。
候補キーが設定されている例
productsテーブル
product_idが主キー、barcodeが候補キー
| product_id | barcode | product_name | price | stock |
|---|---|---|---|---|
| 1001 | 1234567890123 | ノートパソコン | 80000 | 10 |
| 1002 | 9876543210987 | スマートフォン | 50000 | 20 |
| 1003 | 5678901234567 | タブレット | 30000 | 15 |
| 1004 | 4567890123456 | デスクトップPC | 60000 | 5 |
外部キー
外部キーとはある項目に対して、別のテーブルの特定の項目にのみ含まれる値しか入れられない項目のことを言います。
Foreign Keyとも言ったりします。
外部キーが設定されている例
customer_idがordersテーブルで外部キーになっている
customersテーブル
customer_idが主キー
| customer_id | customer_name | tel_number | address |
|---|---|---|---|
| 1001 | 山田太郎 | 010-0000-0000 | 東京都 |
| 1002 | 田中花子 | 020-0000-0000 | 大阪府 |
| 1003 | 佐藤健太 | 030-0000-0000 | 福岡県 |
| 1004 | 鈴木美咲 | 040-0000-0000 | 北海道 |
ordersテーブル
ordered_idが主キー、customer_idが外部キー
| ordered_id | customer_id | product_name | ordered_date |
|---|---|---|---|
| 2001 | 1001 | ノートパソコン | 2023-07-20 |
| 2002 | 1003 | スマートフォン | 2023-07-21 |
| 2003 | 1002 | タブレット | 2023-07-22 |
| 2004 | 1001 | デスクトップPC | 2023-07-23 |