アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

はじめから!リレーショナルデータベース:型を考える

こんにちは!志田です!
前回にひきつづき、リレーショナルデータベースをはじめから勉強していきましょう。


前回のまとめ



とっても便利なデータベースには、いろいろな種類があります。
アシアルブログの笹亀の記事でも、RDBとは違ったNoSQLについての説明がありました。
その中でも、一番ポピュラーなリレーショナルデータベースについて、勉強していきました。

前回は、がんばる企業戦士まさとしが、紙の取引先情報からデータベースの構造について分類をしていきました。
これを、「正規化」といいます。
正規化をすることで、無駄がなく、情報を更新したときに異常が起こらない、柔軟なデータベースを作ることができます。


行と列





前回作った表のひとつをみてみましょう。
表なので、行と列があります。
データベースでも、縦に伸びるデータを行(カラム)、横に伸びるデータを列(レコード)といいます。
レコードが1件1件のデータになります。
カラム名というのは、カラムにつけた名前です。見出しのようなものですね。

カラムは縦に見ればわかるとおり、全て同じデータ(数字、文字など)になっています。
このカラムに対してつけるのが、「」です。


MySQLの型



では、MySQLで使える型を見て行きましょう。

日本語でいうとMySQLでいうと用途
短い整数型tinyintフラグの処理などに使う。男なら1、女なら0など
整数型int数字に使う。会員番号や通し番号など。
浮動小数点型float, double体重など、小数点が必要な数字に使う。
固定長文字列型char(N)桁数の決まっている文字列。Nに文字数を入れる。郵便番号だと「113-0033」で8文字なので、char(8)
可変長文字列型varchar(N)>桁数の決まっていない文字列。255文字までならこれを使う。名前、住所など。名前だと長くても20文字くらいなので、varchar(20)
長い可変長文字列型textメモ、日記の本文など、長い文字列に使う。
日付型date日付に使う。誕生日など。「2012-10-04」
日付時刻型datetime日付と時刻を一緒に扱う。会員登録日などに使う。「2012-10-04 10:23:40」
文字列定数型enum('value1', 'value2',...)リストから選>ぶ形式の型。男=male、女=femaleだと、enum('male', 'female')となり、どちらかを指定する。


他にももっとたくさんの型があり、使い方や指定の方法などいろいろなのですが、
今回はよく使うこれらの型をご紹介しました。

文字列の「桁数」という概念が、ちょっとわかりにくいかもしれません。
例えば、紙の表を思い浮かべて下さい…。
「会社住所」の欄があまりに小さかったら、住所が全部書けませんよね。
ものにはそれぞれ、適切な欄の長さ・大きさがあります。
適切な文字数を決めることはつまり、桁数を決めるということです。

データベースを作る時は、テーブルの正規化を行い、正規化したテーブルに型をつけるという手順で作ります。
では、まさとしさんが、前回のテーブルにどのような型をつけたのか、みてみましょう。

まさとし 型をつける





まず、前回のテーブルの上から考えていきます。

会社テーブル

会社テーブルは、「会社ID」「会社名」「会社住所」「会社電話番号」からなります。
「会社ID」は数字なので、int型がよいでしょう。
「会社名」は、どんなに長くても255文字を超えるようなものはなかったので、varchar(255)にしましょう。
「会社住所」も同じく、長さは255文字程度あれば充分ですので、varchar(255)にします。
「会社電話番号」は、数字だけでできてるな、とまさとしさんは思いました。
・・・でも待てよ、市外局番は0から始まるものもある。それを整数型で扱ったとしたら、先頭の0が無視されちゃうのでは?

そうです。数字からなるデータでも、先頭の0が重要になってくるものは、
「計算のできる数字」でなく、「数字の文字列」にするのが良いです。
「会社電話番号」は、11桁の文字列であるvarchar(11)にしました。

部署テーブル、課名テーブル

部署テーブルと課名テーブルも同様に、
部署ID、会社ID、課ID、部署IDはint型、部署名、課名はvarchar(255)にしました。

担当者テーブル

担当者テーブルは、情報がたくさんあって大変そうです。
まず、他のテーブルと同じように、担当者ID、課IDはint型にし、名前はvarchar(20)にしました。

性別は、表では男性、女性となっています。
まさとしさんは、「じゃあ、これはchar型でいいかな…」と思い、テーブル設計書にcharとメモしました。

そこへ、先輩が通りかかって訊ねました。
「まさとし、それ、間違えて女ってDBに登録しちゃったら、どうするの?
2つのうちのどちらかから選ぶなら、絶対間違えないような型のほうがいいんじゃないの?」

たしかに…。文字列にすると、入力間違いが怖いです。
そこで、まさとしさんはtinyint(1)を使って、男性なら1、女性なら0を入力させることにしました。
これなら、1か0のどちらかしか選ぶ必要はないので、安心です。

「まさとし、それ、お前は1と0でわかりやすいからいいだろうけど、他の人が見たらわかんないよ?」

うう、先輩、確かに。
まさとしさんは、enum型を使い、男性か女性かをリストから選べるようにしました。
enum('male', 'female')とすることで、どちらかの値がDBに入ることになりました。

個人の電話番号は、会社電話番号を同じくvarchar(11)にしました。

日付というのは、名刺をもらった日のことを指しています。
これは、年月日だけがわかっていればいいので、date型にしました。

備考は、どのくらい長くなるかわかりませんから、text型にしました。


テーブル構造完成!





それぞれ考えた型を追記して、テーブル構造が完成しました!

このように、データベースを作るうえで大事な流れは、このようなものです。

(1) テーブルの構成を考える。
(2) 正規化をする。
(3) それぞれのカラムに適切な型をつける。

正規化をして表の構造を整えることも大事ですが、まさとしさんの先輩からの指摘のように、
そのカラムが取り得る値について考え、最適な型を考えるのも重要です。

では、次回は実際にデータベース上でテーブルを作り、操作を行なってみましょう。