【SQL実践|実務向け】PostgreSQLにおける数値データ型の正しい選択と設計の勘所

1. 導入: なぜ数値型選びが重要なのか

データベース設計において、適切なデータ型を選択することは、単なる「容量の節約」以上の意味を持ちます。誤った型を選択すると、計算結果に予期せぬ誤差が生じたり、将来的にデータの桁数が足りなくなってシステム改修を余儀なくされたりします。特に金融系や科学計算などの現場では、型選択のミスがビジネス上の致命的な欠陥になりかねません。本記事では、PostgreSQLで利用可能な数値データ型の特性を整理し、実務で迷わないための指針を解説します。

2. 基礎知識: 数値データ型の種類

PostgreSQLの数値型は、大きく分けて以下の3つのグループに分類されます。

整数データ型 (smallint, integer, bigint)
小数点を含まない整数を扱います。使用メモリサイズが異なり、扱う値の範囲も異なります。

任意の精度を持つ数 (numeric, decimal)
小数点以下の桁数を厳密に管理する型です。計算精度が保証されるため、金額計算などに必須です。

浮動小数点データ型 (real, double precision)
広範囲の数値を扱えますが、内部的な処理により微細な誤差が生じる可能性があります。

3. 実装/解決策: シチュエーション別の使い分け

実務における型選定の基準は以下の通りです。

1. IDやカウントなど、整数のみの場合
基本は integer を使用します。数億件を超える大規模なテーブルの主キーには bigint を採用してください。
2. 金額や税計算など、正確さが求められる場合
必ず numeric 型を使用してください。numeric(18, 2) のように、全体の桁数と小数点以下の桁数を指定するのが定石です。
3. 統計データや科学計算など、巨大な数値の近似値で良い場合
double precision を検討します。ただし、比較演算を行う際は注意が必要です。

4. サンプルプログラム: テーブル定義のベストプラクティス

以下は、業務システムでよく見かけるテーブル設計の例です。

— 商品テーブルの作成例
CREATE TABLE products (
— IDには自動採番を考慮してbigintを使用
product_id BIGINT PRIMARY KEY,

— 在庫数など、負にならない整数はintegerで十分
stock_quantity INTEGER NOT NULL,

— 金額にはnumericを使用(最大15桁、小数点以下2桁まで保証)
price NUMERIC(15, 2) NOT NULL,

— 統計的な重さなど、厳密さが不要な場合はdouble precision
weight_kg DOUBLE PRECISION
);

— データ投入の確認
INSERT INTO products (product_id, stock_quantity, price, weight_kg)
VALUES (1, 100, 1980.50, 0.45678);

— 小数点以下が多い数値をnumericに入れると自動で丸められる
— 1980.555 -> 1980.56 として格納される
INSERT INTO products (product_id, stock_quantity, price)
VALUES (2, 50, 1980.555);

5. 応用・注意点: 現場で陥りやすい罠

誤差の問題
浮動小数点型(real, double precision)で「=」演算子を使って比較を行うのは危険です。内部的に 0.1 が 0.10000000000000001 のように保持されることがあるため、検索がヒットしないケースがあります。等価比較が必要な値には必ず numeric を使用してください。

パフォーマンスの考慮
numeric 型は非常に便利ですが、整数型と比較すると演算速度は遅くなります。数百万行のテーブルで激しく計算を行う場合、不要に大きな精度(precision)を設定せず、必要最小限の範囲に留めるのがパフォーマンス維持のコツです。

オーバーフローの確認
設計段階でデータの最大値を想定し、smallint や integer の限界を超えないか確認してください。特にシステム移行などで古いデータの桁数が予想外に大きい場合、インポート時にオーバーフローエラーが発生し、データパッチが必要になることがよくあります。設計時には必ず上限値の検証を行ってください。

コメント

タイトルとURLをコピーしました