はじめから!リレーショナルデータベース:型を考える
こんにちは!志田です!
前回にひきつづき、リレーショナルデータベースをはじめか ら勉強していきましょう。
前回のまとめ
とっても便利なデータベースには、いろいろな種類があります。
アシアルブログの笹亀の記事でも、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) それぞれのカラムに適切な型をつける。
正規化をして表の構造を整えることも大事ですが、まさとしさんの先輩からの指摘のように、
そのカラムが取り得る値につい て考え、最適な型を考えるのも重要です。
では、次回は実際にデータベース上でテーブルを作り、操作を行なってみましょう。