🖥
SQLのJOINが分からない? じゃあ逆から考えてみよう (親子関係を例にしたりして)
親子関係
Alice には二人の子供がいる。
Carol と David だ。
Bob にも二人の子供がいる。
Eric と Frank だ。
これをデータベースの「1個のテーブル」で表すと、こんな感じになるだろう。
| Parent | Child |
|---|---|
| Alice | Carol |
| Alice | David |
| Bob | Eric |
| Bob | Frank |
AliceもBobも行が重複しているが、1個のテーブルで表現しようとすると仕方がないのだ。
分割してみよう
このテーブルを二個に分割したらどうなる?
|Parent|
|:--|:--|
|Alice|
|Bob|
|Child|
|:--|:--|
|Carol|
|David|
|Eric|
|Frank|
やった、データが綺麗になったぞ!
だけどちょっと待てよ。
誰が誰の子供か分からなくなってしまった。
IDを付けてみよう
親にIDを付ける。
あくまでも親だけだ。子供になんてとんでもない。
Aliceは1でBobは2。
|Id|Parent|
|:--|:--|:--|
|1|Alice|
|2|Bob|
そして子には親のIDを教えるのだ。
忘れるなよ。君たちの親だぞ。
| Child | ParentID |
|---|---|
| Carol | 1 |
| David | 1 |
| Eric | 2 |
| Frank | 2 |
合流だ!
JOINしよう!
これで親子は再び出会えました。
もう離れることはありません。
めでたしめでたし。
| Id | Parent | Child |
|---|---|---|
| 1 | Alice | Carol |
| 1 | Alice | David |
| 2 | Bob | Eric |
| 2 | Bob | Frank |
いずれ子供が増えた時も、子が親元を離れる時も、テーブルも分割されているし、きっとうまくいくことでしょう。
具体的なSQLは?
心の眼で見るのです。
このQiitaはあなたの脳に直接語りかけました。
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
公開日時
2018-07-17
Discussion