前回は、概念モデルからリレーショナルモデルに変換する手順や、リレーショナルモデルとして適切な形式である正規形について説明しました。
正規形に変換したテーブルを、実際にリレーショナルデータベースマネジメントシステム(RDBMS)において定義するには、その前に列のデータ型を決定する必要があります。今回は、RDBMSとしてオープンソースのPostgreSQLを取り上げ、データ型について説明します。
データ型とは
テーブルを定義する際には、そのテーブルの列のデータ型を指定する必要があります。データ型とは、テーブルに格納するデータの取り扱いに関する形式のことであり、データの性質や範囲などを定義したものです。
プログラミングの経験がある方であれば、プログラムにおいて変数を宣言する際にデータ型を指定することがあると思います。データベースにおけるデータ型も基本的にはプログラミングにおけるものと同じです。
ただし、プログラミングにおけるデータ型とデータベースにおけるデータ型では、どのようなデータ型を使用するかということの重要度が大きく異なります。データベースでは、指定したデータ型によって大量のデータが格納されるため、適切ではないデータ型を使用すると、必要以上にディスク容量を消費したり、性能への影響が発生することもあります。
データベースにおいて使用できるデータ型は、標準SQL規格によって定義されています。標準SQL規格によって定義されているデータ型には以下のようなものがあります。カッコ内にはデータ型の別名を記述しています。
- 数値データ型:
- smallint、integer(int)、real、double precision、float、decimal(dec)、numeric
- 文字データ型:
- character(char)、character varying(varchar)、national character(nchar)、national character varying(nvarchar)、character large object(clob)
- 日付・時刻データ型:
- date、time、timestamp、interval
- ビット・バイナリデータ型:
- bit、bit varying、binary large object(blob)
- 論理値データ型:
- boolean
テーブルを定義する際には、上記のようなデータ型から適切なものを選択します。しかし、そのデータ型が実際に使用できるかどうかということはRDBMSによって異なります。
また、RDBMSによっては標準SQL規格には定義されていないデータ型が定義されていることも少なくなく、そのようなデータ型を使用したほうが適切である場合もあります。
先に述べましたように、今回はRDBMSとしてオープンソースのPostgreSQLを例として、一般的によく使用される整数データ型、文字データ型、および日付・時刻データ型といった基本的なデータ型について説明します。
数値データ型
数値データ型は数値を格納するためのデータ型です。PostgreSQLにおいて使用できる数値データ型には表1のようなものがあります。カッコ内のpは位取り(小数点以下の桁数)、sは精度(小数点をはさんで両側の桁数の合計)を表しており、データ型とともに指定することができます。
表1 PostgreSQLの数値データ型
データ型名 | 説明 | 数値の範囲 |
smallint | 2バイト整数 | -32768から32767まで |
integer | 4バイト整数 | -2147483648から2147483647まで |
bigint | 8バイト整数 | -9223372036854775808から 9223372036854775807まで |
real | 単精度浮動小数点数 | 6桁(-1E+37から1E+37まで) |
double precision | 倍精度浮動小数点数 | 15桁(-1E+308から1E+308まで) |
numeric(p, s) | 高精度数値 | 最大1000桁 |
decimal(p, s) |
数値データ型は、格納するデータが整数であるか、それとも浮動小数点数であるか、また、数値の取り得る範囲によって適切なものを選択します。bigint型はPostgreSQLにおける独自の拡張です。なお、金額などのように正確なデータの格納と計算が必要となるデータにはnumeric型を使用します。
numeric型は、最大1000桁の精度によって数値を格納でき、正確な計算を行うことができます。PostgreSQLにおけるdecimal型はnumeric型とまったく同じデータ型となります。
ただし、numeric型は、integer型やreal型といったデータ型と比較すると、そのデータに対する計算が非常に遅く、消費されるディスク容量も大きくなります。従って、とくにnumeric型を使用する必要がない限り、integer型やreal型を使用するべきです。
文字データ型
文字データ型は文字を格納するためのデータ型です。PostgreSQLにおいて使用できる文字データ型には表2のようなものがあります。カッコ内のnは文字長を表しており、データ型とともに指定することができます。
表2 PostgreSQLの文字データ型
データ型名 | 説明 |
character(n) | 固定長文字列 |
character varying(n) | 可変長文字列 |
text | 制限なし可変長文字列 |
固定長文字列を格納する場合にはcharacter型を使用します。character型では、指定した文字長のデータを格納することができ、データが指定した文字長に満たない場合にはその文字長まで空白によって埋められます。
character型に対して可変長文字列を格納する場合にはcharacter varying型を使用します。character varying型では指定した文字長までデータを格納することができます。
PostgreSQLでは、character型、およびcharacter varying型の文字長を指定する際には、日本語のようなマルチバイト文字であっても文字数となりますが、RDBMSによっては文字数ではなくバイト数を指定する場合もあります。
制限なしの可変長文字列を格納する場合にはtext型を使用します。text型はPostgreSQLにおける独自の拡張ですが、他の多くのRDBMSでも使用することができるデータ型です。
なお、RDBMSによってはcharacter型を使用したほうが可変長の文字データ型よりも性能がいいという場合もありますが、PostgreSQLでは少なくとも性能についてはこれらの文字データ型に違いはありません。
日付・時刻データ型
PostgreSQLにおいて使用できる日付・時刻データ型には表3のようなものがあります。カッコ内のpは時刻における秒の小数点以下の桁数を表しており、データ型とともに指定することができます。
表3 PostgreSQLの日付・時刻データ型
データ型名 | 説明 |
date | 日付 |
time(p) | 時刻 |
timestamp(p) | 日付と時刻 |
interval(p) | 間隔 |
date型では2007年10月15日といった日付、time型では4時53分11秒といった時刻、timestamp型では2007年10月15日4時53分11秒といった日付と時刻を合わせてデータとして格納することができます。また、interval型は時間の間隔を格納するためのデータ型となります。
今回は、RDBMSとしてオープンソースのPostgreSQLを取り上げ、基本的なデータ型について説明しました。データ型はRDBMSによって使用できるものが異なり、データ型を決定する際には注意する必要があります。
次回は、テーブルに格納するデータを限定する制約と、データベースの性能を向上させるインデックスについて説明します。