正規化
User No 名前 Email
1 zaru zaru@example.com
2 mu mu@example.com
ToDo No ToDo 完了 登録日時 User No
1 生放送する 完了 2020-05-31 1
2 コード書く 未完了 2020-06-01 1
3 絵を描く 未完了 2020-06-02 2
4 ご飯つくる 未完了 2020-06-04 1
「ToDo テーブル」と「 User テーブル」の2つに分割。
詳しくは次回
Slide 8
Slide 8 text
正規化の前に、前提
テーブル(表)
人が扱いやすい形式
リレーショナル DB が
扱いやすい形式
違う
Slide 9
Slide 9 text
人が扱いやすいように作りがちな表
ユーザ名 Email ToDo 完了 登録日時
zaru zaru@example.com
生放送する 完了 2020-05-31
コード書く 未完了 2020-06-01
mu mu@example.com 絵を描く 未完了 2020-06-02
同じ項目を
セル結合する
ユーザ名 Email ToDo 完了 登録日時 ToDo 完了 登録日時
zaru zaru@example.com 生放送する 完了 2020-05-31 コード書く 未完了 2020-06-01
mu mu@example.com 絵を描く 未完了 2020-06-02 右に項目を
追加し
繰り返す
Slide 10
Slide 10 text
人が読みやすいように作りがちな表
ユーザ名 Email ToDo 完了 登録日時
zaru zaru@example.com
生放送する 完了 2020-05-31
コード書く 未完了 2020-06-01
mu mu@example.com 絵を描く 未完了 2020-06-02
同じ項目を
セル結合する
ユーザ名 Email ToDo 完了 登録日時 ToDo 完了 登録日時
zaru zaru@example.com 生放送する 完了 2020-05-31 コード書く 未完了 2020-06-01
mu mu@example.com 絵を描く 未完了 2020-06-02
右側に項目を
追加していく
こういった Excel などで作りがちな表形式は、
リレーショナル DB では扱いにくい
Slide 11
Slide 11 text
ToDo No ToDo 完了 登録日時 ユーザ名 Email
1 生放送する 完了 2020-05-31 zaru zaru@example.com
2 コード書く 未完了 2020-06-01 zaru zaru@example.com
3 絵を描く 未完了 2020-06-02 mu mu@example.com
行
列
リレーショナル DB が扱える形式
1行に、1個単位で成立に必要な情報が集約されている
Slide 12
Slide 12 text
ToDo No ToDo 完了 登録日時 ユーザ名 Email
1 生放送する 完了 2020-05-31 zaru zaru@example.com
2 コード書く 未完了 2020-06-01 zaru zaru@example.com
3 絵を描く 未完了 2020-06-02 mu mu@example.com
もっと扱いやすくする
Slide 13
Slide 13 text
ToDo No ToDo 完了 登録日時 ユーザ名 Email
1 生放送する 完了 2020-05-31 zaru zaru@example.com
2 コード書く 未完了 2020-06-01 zaru zaru@example.com
3 絵を描く 未完了 2020-06-02 mu mu@example.com
もっと扱いやすくする
情報が重複
している
例えば、ユーザ名やメールアドレスを変更しようとする
と、関係する全ての行を更新操作しなくてはならない…
Slide 14
Slide 14 text
ユーザ名 Email
zaru zaru@example.com
mu mu@example.com
ToDo No ToDo 完了 登録日時
1 生放送する 完了 2020-05-31
2 コード書く 未完了 2020-06-01
3 絵を描く 未完了 2020-06-02
4 ご飯つくる 未完了 2020-06-04
ToDo No ToDo 完了 登録日時 ユーザ名 Email
1 生放送する 完了 2020-05-31 zaru zaru@example.com
2 コード書く 未完了 2020-06-01 zaru zaru@example.com
3 絵を描く 未完了 2020-06-02 mu mu@example.com
「ToDo テーブル」と「 User テーブル」の2つに分割。
こうすることで、ユーザ名を変更する時は User テーブルの
1行だけを更新操作すれば済み、無駄がなくなる。
ここだけ
変更すればOK
Slide 15
Slide 15 text
ユーザ名 Email
zaru zaru@example.com
mu mu@example.com
ToDo No ToDo 完了 登録日時
1 生放送する 完了 2020-05-31
2 コード書く 未完了 2020-06-01
3 絵を描く 未完了 2020-06-02
4 ご飯つくる 未完了 2020-06-04
ToDo No ToDo 完了 登録日時 ユーザ名 Email
1 生放送する 完了 2020-05-31 zaru zaru@example.com
2 コード書く 未完了 2020-06-01 zaru zaru@example.com
3 絵を描く 未完了 2020-06-02 mu mu@example.com
「ToDo テーブル」と「 User テーブル」の2つに分割。
こうすることで、ユーザ名を変更する時は User テーブルの
1行だけを更新操作すれば済み、無駄がなくなる。
ここだけ
変更すればOK
リレーショナル DB が扱いにくい形式から、
扱いやすい形式に変えていくことを「正規化」と呼ぶ
Slide 16
Slide 16 text
あらためて、
正規化ってなに?
テーブル(表)
人が扱いやすい形式
リレーショナル DB が
扱いやすい形式
正規化とは、リレーショナル DB が情報を扱いやすいように変更するこ
と。扱いやすいとは、冗長ではなく整合性が維持され効率的であること
Slide 17
Slide 17 text
分けたはいいけど…
テーブルを分けたはいいが、どうやって ToDo とユーザの情
報を一緒に取得すればいいのか?
ユーザ名 Email
zaru zaru@example.com
mu mu@example.com
ToDo No ToDo 完了 登録日時
1 生放送する 完了 2020-05-31
2 コード書く 未完了 2020-06-01
3 絵を描く 未完了 2020-06-02
4 ご飯つくる 未完了 2020-06-04
Slide 18
Slide 18 text
結合するための情報
User No ユーザ名 Email
1 zaru zaru@example.com
2 mu mu@example.com
ToDo No ToDo 完了 登録日時 User No
1 生放送する 完了 2020-05-31 1
2 コード書く 未完了 2020-06-01 1
3 絵を描く 未完了 2020-06-02 2
4 ご飯つくる 未完了 2020-06-04 1
二つのテーブルの行同士を紐づけるための列を追加する。
ユーザ毎に No を振り、そのユーザが作った ToDo にユーザ
No を追加することで結合するための情報になる。
Slide 19
Slide 19 text
プライマリーキー
User No ユーザ名 Email
1 zaru zaru@example.com
2 mu mu@example.com
ToDo No ToDo 完了 登録日時 User No
1 生放送する 完了 2020-05-31 1
2 コード書く 未完了 2020-06-01 1
3 絵を描く 未完了 2020-06-02 2
4 ご飯つくる 未完了 2020-06-04 1
行をテーブルの中から、一意に特定可能な列のことをプライマリー
キー(主キー)と呼ぶ。一般的にリレーショナル DB では 1 から始
まる連番が採用される。テーブルの中で必ずユニークでなくてはな
らない。
Slide 20
Slide 20 text
テーブルの結合 JOIN
SELECT 取得したい列名
FROM テーブルA
JOIN テーブルB
ON テーブルA.列名 = テーブルB.列名
user_id name
1 zaru
2 mu
todo_id todo user_id
1 生放送する 1
2 コード書く 1
3 絵を描く 2
4 ご飯つくる 1
user_id が
二つのテーブルを
紐づけるための列
SELECT *
FROM todos
JOIN users
ON todos.user_id = users.user_id
todos users
Slide 21
Slide 21 text
テーブルの結合 JOIN
SELECT 取得したい列名
FROM テーブルA
JOIN テーブルB
ON テーブルA.列名 = テーブルB.列名
todo_id todo user_id user_id name
1 生放送する 1 1 zaru
2 コード書く 1 1 zaru
3 絵を描く 2 2 mu
4 ご飯つくる 1 1 zaru
SELECT *
FROM todos
JOIN users
ON todos.user_id = users.user_id
todos テーブルの
右側に user_id に
対応した users テー
ブルが結合された
Slide 22
Slide 22 text
テーブルの結合 JOIN
SELECT テーブル名.取得したい列名
FROM テーブルA
JOIN テーブルB
ON テーブルA.列名 = テーブルB.列名
todo name
生放送する zaru
コード書く zaru
絵を描く mu
ご飯つくる zaru
SELECT todos.todo, users.name
FROM todos
JOIN users
ON todos.user_id = users.user_id
欲しい列名の前に
ドットでテーブル名
を付けて指定できる
Slide 23
Slide 23 text
ありがとうございました!
6/18(木)21:00~
「PHP で作る はじめての Web サイト(Docker 環境構築編)#1」
6/25(木)21:00~
「PHP で作る はじめての Web サイト(DB 接続編)#2」
質問感想など呟いていただけると嬉しいです!
ハッシュタグ #mu_zaru