データベース
RDBMS
リレーショナルデータベース

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

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


どうも(p・ω・q)
今日のお題はリレーショナルデータベースです。

この時期なので、設定は「年賀状管理」にでもしましょうか。
投函期間はまだかろうじて過ぎていませんよ(@´ω`@)<25カナ

+

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

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

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

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

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

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

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

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

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

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

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

年賀状の記録

出or入 相手の名前
2009 出した 骨川スネ夫
2009 出した 野原しんのすけ
2009 もらった 野原しんのすけ
2010 出した 野原しんのすけ
2010 出した ミニーマウス

友達の情報

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

すっきりしました。

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

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

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

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

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

20101223.png

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

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

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

年賀状の記録

出or入 相手(友達ID)
2009 出した 1
2009 出した 2
2009 もらった 2
2010 出した 2
2010 出した 3

友達の情報
友達ID 名前 性別 郵便番号 住所
1 骨川スネ夫 176-0000 東京都練馬区月見台すすきヶ原 3-10-5
2 野原しんのすけ 344-0000 埼玉県春日部市双葉町 904
3 ミニーマウス 279-8512 千葉県浦安市舞浜1-1 TDL トゥーンタウン ミッキーAve.1

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

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

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

それではまた。