2010/12/23 RDBMSを使っているのに「リレーショナル」がよく分からない人たちへ

昔書いた社内ブログ記事です。

---

どうも（ｐ・&omega;・ｑ）
今日のお題は**リレーショナルデータベース**です。

この時期なので、設定は「年賀状管理」にでもしましょうか。
投函期間はまだかろうじて過ぎていませんよ（＠&acute;&omega;｀＠）＜25ｶﾅ

+

年賀状を出すのに必要なのは、名前と住所の情報ですね。
男の子向けと女の子向けの絵柄を使い分けるので、性別も書いておきましょう。

これを身近なところで、エ■セルにまとめてみます。


<table class="border"><tbody><tr><th>名前</th><th>性別</th><th>郵便番号</th><th>住所</th></tr> <tr><td>骨川スネ夫</td><td>男</td><td>176-0000</td><td>東京都練馬区月見台すすきヶ原 3-10-5</td></tr> <tr><td>野原しんのすけ</td><td>男</td><td>344-0000</td><td>埼玉県春日部市双葉町 904</td></tr> <tr><td>ミニーマウス</td><td>女</td><td>279-8512</td><td>千葉県浦安市舞浜1-1 TDL トゥーンタウン ミッキーAve.1</td></tr></tbody></table> 

これだけじゃあまり役に立たないので、
年賀状を出したか出さないか、もらったかもらってないかも書いてみます。


<table class="border"><tbody><tr><th>名前</th><th>性別</th><th>郵便番号</th><th>住所</th><th>2009年
出した</th><th>2009年
もらった</th><th>2010
年出した</th></tr> <tr><td>骨川スネ夫</td><td>男</td><td>176-0000</td><td>東京都練馬区月見台すすきヶ原 3-10-5</td><td>○</td><td>&times;</td><td>&times;</td></tr> <tr><td>野原しんのすけ</td><td>男</td><td>344-0000</td><td>埼玉県春日部市双葉町 904</td><td>○</td><td>○</td><td>○</td></tr> <tr><td>ミニーマウス</td><td>女</td><td>279-8512</td><td>千葉県浦安市舞浜1-1 TDL トゥーンタウン ミッキーAve.1</td><td>&times;</td><td>&times;</td><td>○</td></tr></tbody></table> 

これだとどんどん右に伸びていって使いにくいですね。
（私の母親はこれを手帳に書いていたような気がしますｗ）


また、一番上の行（見出し）は一度決めたら、
極力変更しない方がメンテナンスがしやすいです。

なので、表を下に伸ばすように書いてみます。


<table class="border"><tbody><tr><th>年</th><th>出or入</th><th>名前</th><th>性別</th><th>郵便番号</th><th>住所</th></tr> <tr><td>2009</td><td>出した</td><td>骨川スネ夫</td><td>男</td><td>176-0000</td><td>東京都練馬区月見台すすきヶ原 3-10-5</td></tr> <tr><td>2009</td><td>出した</td><td>野原しんのすけ</td><td>男</td><td>344-0000</td><td>埼玉県春日部市双葉町 904</td></tr> <tr><td>2009</td><td>もらった</td><td>野原しんのすけ</td><td>男</td><td>344-0000</td><td>埼玉県春日部市双葉町 904</td></tr> <tr><td>2010</td><td>出した</td><td>野原しんのすけ</td><td>男</td><td>344-0000</td><td>埼玉県春日部市双葉町 904</td></tr> <tr><td>2010</td><td>出した</td><td>ミニーマウス</td><td>女</td><td>279-8512</td><td>千葉県浦安市舞浜1-1 TDL トゥーンタウン ミッキーAve.1</td></tr></tbody></table> 

さきほどよりマシになりましたが、今度は同じことが何箇所にも書いてあって見にくくなりました。

だぶっている情報はまとめて、表を分割してみましょう。


年賀状の記録

<table class="border"><tbody><tr><th>年</th><th>出or入</th><th>相手の名前</th></tr> <tr><td>2009</td><td>出した</td><td>骨川スネ夫</td></tr> <tr><td>2009</td><td>出した</td><td>野原しんのすけ</td></tr> <tr><td>2009</td><td>もらった</td><td>野原しんのすけ</td></tr> <tr><td>2010</td><td>出した</td><td>野原しんのすけ</td></tr> <tr><td>2010</td><td>出した</td><td>ミニーマウス</td></tr></tbody></table> 

友達の情報

<table class="border"><tbody><tr><th>名前</th><th>性別</th><th>郵便番号</th><th>住所</th></tr> <tr><td>骨川スネ夫</td><td>男</td><td>176-0000</td><td>東京都練馬区月見台すすきヶ原 3-10-5</td></tr> <tr><td>野原しんのすけ</td><td>男</td><td>344-0000</td><td>埼玉県春日部市双葉町 904</td></tr> <tr><td>ミニーマウス</td><td>女</td><td>279-8512</td><td>千葉県浦安市舞浜1-1 TDL トゥーンタウン ミッキーAve.1</td></tr></tbody></table> 

すっきりしました。


この2つの表を見て「2010年に女の子に出した年賀状の枚数（笑）」が分かりますか？

「年賀状の記録」表で2010年に年賀状を出した相手の名前を覚えて、
「友達の情報」表で、その名前の人の性別を調べればいいんですね。

（「ミニーマウス」って名前だから女だって決め付けちゃダメですよｗ）


こうやって2つの表の関係性（リレーション）を見ながら
知りたい情報を引き出すことを得意とするデータベースを
**「リレーショナルデータベース」**と言います。

「友達の情報」表の「名前」と「年賀状の記録」表の「相手の名前」が
同じ人を指しているっていうのがこの場合の関係性ですね。


![20101223.png](https://qiita-image-store.s3.amazonaws.com/0/214263/7b2fce59-c35f-caf7-767f-4d0d237c60d0.png)


大きな表になんでもかんでも情報をまとめないで、
表を小分けに管理しておくと、ちょっとの調べ物や、
内容を変更するのにもあまり手間がかからないのです。

「友達の情報」に後から「誕生日」の項目を追加したりとかね。


ちなみに同姓同名の人がいるかもしれないことや、
実際にこの表を使うのはコンピュータだということから、
基本情報を管理する表にはかぶらない番号をふるのが普通です。
（この場合は友達の情報の表。） 

年賀状の記録
<table class="border"><tbody><tr><th>年</th><th>出or入</th><th>相手（友達ID）</th></tr> <tr><td>2009</td><td>出した</td><td>1</td></tr> <tr><td>2009</td><td>出した</td><td>2</td></tr> <tr><td>2009</td><td>もらった</td><td>2</td></tr> <tr><td>2010</td><td>出した</td><td>2</td></tr> <tr><td>2010</td><td>出した</td><td>3</td></tr></tbody></table> 
友達の情報
<table class="border"><tbody><tr><th>友達ID</th><th>名前</th><th>性別</th><th>郵便番号</th><th>住所</th></tr> <tr><td>1</td><td>骨川スネ夫</td><td>男</td><td>176-0000</td><td>東京都練馬区月見台すすきヶ原 3-10-5</td></tr> <tr><td>2</td><td>野原しんのすけ</td><td>男</td><td>344-0000</td><td>埼玉県春日部市双葉町 904</td></tr> <tr><td>3</td><td>ミニーマウス</td><td>女</td><td>279-8512</td><td>千葉県浦安市舞浜1-1 TDL トゥーンタウン ミッキーAve.1</td></tr></tbody></table> 

表をどうやって作ったり分けたりしたらいいのかっていうのは
データベース設計という工程でやります。
答えはひとつではないので、そういうのを考えるのも面白いです。


Oracle、MySQL、PostgresSQLはリレーショナルデータベースです。
リレーショナルではないデータベースもあります。
最近だとNoSQLとか。


```sql:SQL
select love from you where date = '2010-12-25';
```


それではまた。