今回は、SQLのデータ型のうち、種類が多く存在する「数値型」について説明します。
数値型データは、実社会においても最も多いデータ型のひとつで、データベースのコアな情報でもあります。SQLの数値型では、INT
やSMALLINT
などの整数型のほか、FLOAT
のような浮動小数点型も存在しています。
この記事では、SQLの最適な数値型(桁数)の選び方と、データベースに与える影響について解説します。
数値型の基本
この章では、数値型とはなにか、SQLの数値型の種類など、まずは数値型の基本について説明します。冒頭でも書いていますが、数値型は実社会でも多く存在しているデータ型のひとつです。
数値型とはなにか
数値型とは、数あるデータ型のうち数値属性を持ったデータのことです。
数値型は、文字ではなく「数値として」扱われますので、四則演算などを行ったり、大小比較、平均値などを求めたりすることができます。数値型は、Excelでも頻出するデータ型のため、SQLに詳しくなくてもイメージはし易いでしょう。
数値型はSQLのみではなく、Excelや各種プログラミング言語でも使われている基本的な概念です。
数値型の種類
数値型は、整数型、浮動小数点型、固定小数点型などに細分化されます。
SQLでは、INT
(整数)、DECIMAL
(固定小数点)、FLOAT
(浮動小数点)など、目的に応じた複数の数値型が存在するため、用途に応じた適切なデータ型を選択する必要があります。
データベースの基本設計を行う際には、各数値型の特徴、扱える数値の範囲などは把握しておきましょう。
数値型の選び方
この章では、整数型、浮動小数点型、固定小数点型の各数値型について、選び方の基本となる考え方を説明します。可能な限り最小型を取りつつも、拡張性・将来性を考慮することがポイントです。
整数型の選び方
SQLにおける整数型は、ID番号、年齢、金額といった、小数点以下の数値を必要としないデータの格納に最適です。
整数型にはINT
、SMALLINT
、TINYINT
、BIGINT
などがあり、それぞれが扱える数値の範囲が異なります。選択時には、データが将来的に取りうる最大値を考慮しつつ、可能な限りストレージを節約できる最小の型を選ぶことが重要です。
たとえば、社員数が最大で数百人程度の企業の社員番号を格納する場合はSMALLINT
(-32,768 から 32,767までの範囲)が適しているかもしれません。
一方、数百万から数十億のユーザーを持つ可能性があるWebアプリケーションでは、BIGINT
型(-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807までの範囲)を選択する必要があるでしょう。これは、将来的に非常に大きな数のユーザーIDを扱う可能性があるためです。
データ型名(整数型) | 範囲 |
---|---|
INT | -2,147,483,648から2,147,483,647 |
SMALLINT | -32,768 から 32,767 |
TINYINT | 0 から 255 |
BIGINT | -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 |
浮動小数点型の選び方
浮動小数点型は、科学計算や金融計算で必要とされる非常に大きい数値や小さい数値を扱う場合に使用されます。
FLOAT
とREAL
が浮動小数点型のデータ型名です。FLOAT
は単精度浮動小数点数、 REAL
は倍精度浮動小数点数を扱います。FLOAT
はストレージ効率が良いですが、精度はREAL
よりも低くなります。
高い精度が要求される金融データや精密な計算が必要な科学技術計算ではREAL
が適しています。一方、データの容量が問題となる大規模なデータセットであれば、FLOAT
を選択することでストレージの節約が期待できます。
データ型名(浮動小数点型) | 範囲 |
---|---|
FLOAT ※精度は約7桁 | -3.402823466E+38 から -1.175494351E-38 0 1.175494351E-38 から 3.402823466E+38 |
REAL ※精度は約15桁 | -1.7976931348623157E+308 から -2.2250738585072014E-308 0 2.2250738585072014E-308 から 1.7976931348623157E+308 |
固定小数点型の選び方
固定小数点型は、精度を失うことなく正確な小数点数を保持する必要がある場合に使用されます。
DECIMAL
やNUMERIC
が固定小数点型のデータ型名です。金融データの格納に特に適しており、利益計算や会計データなど、精度が重要な数値情報の扱いに最適です。DECIMAL
型では、開発者は数値の全体の桁数と小数点以下の桁数を指定でき、この特性により計算時の丸め誤差を防ぐことができます。
使用するデータの精度を事前に把握し、必要な精度に合わせて桁数を適切に設定することが重要です。
データ型名(固定小数点型) | 範囲 |
---|---|
DECIMAL | 精度とスケールは指定可能 |
NUMERIC | 精度とスケールは指定可能 |
DECIMAL
とNUMERIC
は、同等の機能を持つデータ型名です。両方存在する理由は、主に歴史的背景とSQL標準の定義によるものです。
現実のデータベース設計やアプリケーション開発においては、それぞれの型の間で機能的な違いを意識する必要はありません。どちらの型も、必要な精度とスケールを持つ数値データを扱う際に選択できるオプションと考えることができます。
数値型がデータベースに与える影響
この章では、数値型の選択がデータベースのストレージやパフォーマンスに与える影響について、解説します。データベースの設計において、「とりあえず余裕を持って」という単純な理由で大きめのデータ型を選択することは、推奨されません。
ストレージへの影響
データ型のサイズはデータベースに格納される各レコードのスペース使用量に直接影響します。
たとえば、BIGINT
型を選択した場合、格納するデータがINT
型で十分なサイズであっても、BIGINT
が占めるストレージ量は変わりません。これは、データベースが各数値型に予約するスペース量が固定されているためです。
つまり、実際に必要とするデータのサイズに見合った数値型を選択しないと、レコード数が増えるにつれて、無駄なストレージの消費が膨らんでしまうのです。
パフォーマンスへの影響
データ型のサイズはデータベースのパフォーマンスにも影響を与えます。
不必要に大きなデータ型を使用すると、データの読み書きに要する時間が増加し、特に大量のデータを扱うクエリの処理速度が低下する可能性があります。また、インデックスのサイズが大きくなり、検索効率にも悪影響を及ぼすかもしれません。
適切なサイズのデータ型を選択することで、データベースエンジンはより効率的にデータを処理でき、アプリケーションのレスポンス時間の向上が期待できます。
初期設定の重要性
データベースの設計段階での適切な数値型の選択は、単に現在のデータ要件を満たすだけでなく、将来の成長や拡張を踏まえたうえでの重要な決定事項です。初期に正確なデータ型を選択しておくことは、後々、データ型を変更する必要性に迫られないためにも不可欠です。
データ型の変更は技術的に不可能ではありませんが、下記の理由により慎重を期す重大な作業です。
- データの移行: 既存のデータを新しいデータ型に合わせて移行する必要があります。これは、特に大規模なデータセットを扱う場合、時間がかかり、思わぬ作業負担に発展する可能性があります。
- アプリケーションコードの変更: データ型を変更すると、そのデータを扱うアプリケーションのコードも修正する必要があります。これには、開発作業だけでなく、徹底的なテストも伴います。
- パフォーマンスへの影響: 新しいデータ型は、元のデータ型と比較してパフォーマンスに異なる影響を与える可能性があります。特に、データ型が大きくなる場合、データの読み書きに要する時間が長くなることがあります。
実例で学ぶ数値型の選び方
この章では、商品データベース、社員データベース、顧客データベースを例に、格納するデータの取り扱いについて例示します。実際には、規模や拡張性、将来性によって検討する必要がありますが、汎用例としてご覧ください。
商品データベース
- 商品ID: 商品のユニーク性を確保するために
INT
またはBIGINT
を使用します。商品数が将来的に数百万を超える可能性がある場合は、BIGINT
を選択します。 - 価格: 日本円での取引を考えると、小数点以下の金額は一般的ではありませんが、割引や税率の計算で小数を扱う場合があります。そのため、
DECIMAL(10,0)
または計算精度を考慮してDECIMAL(10,2)
を使用することが推奨されます。このように計算時の正確さを保ちつつ、必要に応じて小数点以下の精度を確保できます。 - 在庫数: 多くの場合、
INT
が適していますが、小規模な店舗や事業であればSMALLINT
でも十分な場合があります。在庫が32,767個を超えることがなければ、SMALLINT
でストレージを節約できます。
社員データベース
- 社員番号: 企業規模によりますが
INT
が一般的です。ただし、非常に大規模な企業ではBIGINT
を検討します。 - 給与:
DECIMAL(15,2)
を使用して、給与計算の精度を保証します。 - 部署ID: 通常は
SMALLINT
で十分です。部署数が数百を超えない限り、範囲内で収まります。
顧客データベース
- 顧客ID: 顧客基盤の拡大を見越して
BIGINT
を選択します。将来的にも顧客IDが枯渇することなく管理できます。 - 年齢: 通常は
TINYINT
で十分です。年齢は0から100までの範囲で収まるため、ストレージを節約できます。
あとがき
今回は、 SQLの数値型(整数型-浮動小数点型-固定小数点型)の各データ型名について、選び方とデータベースへの影響を解説しました。
実際には、記事のように現在の規模から最適なデータ型名を単純に選択できるわけではありませんが、拡張性や将来性を踏まえて、適切なデータ型名を検討すべき理由については、ご理解いただけたかと思います。
適切なデータ型の選択は、ストレージの効率化、パフォーマンスの最適化、そして何よりもデータベースのスケーラビリティと将来の拡張性を確保するために不可欠です。
特に、初期の設計段階で適切な選択をすることが、長期にわたるデータベースの信頼性とメンテナンスの効率を大きく左右します。