即活用!ツールを活用したデータモデリング
使用するデータ型を統一する
使用するデータ型を統一する
このようにきめ細やかなデータ型が用意されているのに対し、データベース設計者はどのデータ型を採択するかを決めなければなりません。例えば、Northwindの社員コードは数値型を使っていますが、一般にはコード類を文字型に統一する方が多いと思います。
その場合でも社員コードなど桁数が決まっているものはchar(8)というように固定長文字列タイプを使い、社員名などのように桁数がデータにより異なるカラムはvarchar(20)というように可変長文字列タイプを使うのが普通でしょう。
| Northwind | 梅田の使い方 | |||
|---|---|---|---|---|
| 列名 | データ型 | SQL Server | Oracle | 方針 |
| 使用停止 | Bit | Decimal(1,0) | Number(1,0) | Bitは索引を張れないので使わない |
| 運賃 | Money | Decimal(8,0) | Number(8,0) | 数値型はDecimalに統一 |
| 数量 | Smallint | Decimal(4,0) | Number(4,0) | 数値型はDecimalに統一 |
| 値引 | Real | Decimal(5,2) | Number(5,2) | 数値型はDecimalに統一 |
| 社員番号 | Int | Nvarchar(8) | Nvarchar2(8) | ID関連は文字型を使う |
| 地域明細 | Nchar(50) | Nvarchar(50) | Nvarchar2(50) | 文字型はNvarcharに統一 |
| 備考 | Ntext | Ntext | Nclob | 長い可変長文字列はNclobを使用 |
| 受注日 | Datetime | Datetime | Date | 日付・時刻はDateを使用 |
| 写真 | Image | Image | Blob | 音声や画像はBlob使用 |
表2:Northwindのデータ型使い分けと筆者プラン
表2の左欄は、Northwindで採択されているデータ型です。格納されるデータによりbitやmoney、smallint、int、realなど様々なデータ型が使われています。ただしこのデータベースは「見本」なので、意図的に様々なデータ型を使っているのかも知れません。
実際のデータベース設計では、使用するデータ型をもっと統一した方がよいと思います。表2の右欄に著者だったらどれにするかを、SQL ServerとOracleの両ケースで記載しています。著者はできるだけデータ型を統一した方が開発・メンテナンスが楽ちんという考えで、データの種類によりデータ型を表3のように統一しています。
| 金額や数値 |
真数(Decimal/Number) |
|---|---|
| 文字列 |
可変長文字列(Nvarchar/Nvarchar2) |
| ID、番号、コード |
可変長文字列(Nvarchar/Nvarchar2) |
| フラグ |
真数(Decimal/Number) |
| 区分、タイプ、パターン | 可変長文字列(Nvarchar/Nvarchar2) |
表3:データの種類によるデータ型の統一
例えば金額や数値などは、格納される値に小数点があるかどうか、最大桁数の大きさがいくつかにかかわらず真数(SQL Server:Decimal/Oracle:Number)を使います。また文字列であれば、文字数が決まっているかどうかにかかわらず可変長文字列(SQL Server:Nvarchar /Oracle:Nvarchar2)一本で勝負です。
カラム名とデータ型との関係も固定化し、コードや区分という名称が付けば必ず文字型、フラグという名称が付けば必ず数値型というように、そのアプリケーション内ではカラム名とデータ型との関係は統一します。
このようなルールを定めておけば、あるときはdecimal、あるときはintというように神経を使う必要がありません。ディスクやメモリ容量が飛躍的に大きくなった現代において、わずかなデータサイズを惜しんでばらばらにするよりは、統一によりミスを少なくする方が勝ると考えています。
最後に
今回は、データベース設計に取り掛かる際に最初にぶつかる問題である、「日本語を使うか?」「データ型を使い分けるか?」という2点をテーマにしました。このあたりは、人によって様々な考え方があるところです。こんなふうに考えている人もいるんだなと思っていただければ結構だと思います。