開発者がフィールド設計を行う際には、主にフィールドの型と長さを考慮する必要があります。本記事では、いくつかのシナリオにおける文字型の推奨値を提示し、開発者がフィールド設計を標準化する一助とします。
MySQLモード
数値型フィールド。
将来的な範囲超過を防ぐため、
int、smallintなどの整数型に代わり、bigint型の使用を推奨します。文字型フィールド。
すべての動的文字列について、
VARCHAR(N)型の使用を推奨します。単一文字のみを格納するフィールドには
CHAR(1)を使用します。はい/いいえの概念を表すフィールドでは、スペース節約のためCHAR(1)型を使用することを推奨します(1 は TRUE、0 は FALSE を表します)。値の内容とアプリケーションでの解釈は統一する必要があります。例:論理削除を表すフィールド名is_deletedでは、1 が削除、0 が未削除を意味します。
注意
NUMBER(1) もはい/いいえの概念を表現できますが、より多くのスペースを消費します。
- 列の型として
NVARCHAR、NCLOBなどの型の使用は禁止されています。
注意
文字データ型の列はすべての英数字を格納できますが、
NUMBERデータ型の列は数字のみを格納できます。日付時刻フィールド。
時刻の精度が求められる業務では、
datetime(6)を使用できます。精度が不要な場合は、
datetimeに設定します。将来的に国際化が必要になる場合は、
timestampの使用を推奨します。時刻フィールドのデータ型として文字を使用することは推奨されません。使用すると暗黙的な型変換が発生しやすいためです。
データフィールドの選択に関する推奨事項。
特に大規模なテーブル(数百万レベル)では、以下の方法を推奨します:
業務内の各テーブルにおける時間フィールドは、必ず統一してください。
DATE型の使用を推奨します。精度が要求される業務ではTIMESTAMP型を使用できます。IPアドレスを格納するテーブルが大規模な場合、ストレージ容量を節約するために
NUMBER数値型の使用を推奨します。フロントエンドで変換を行います。使用する数値範囲はネットワークセグメントデータと一致させてください。業務ニーズに応じて、IPv4 と IPv6 を別々のフィールドに分けて格納し、
VARCHAR(N)を使用することもできます。
Oracleモード
数値型フィールド
NUMBER型の使用を推奨します。NUMBERは固定小数点数や10進数精度の数値を格納する場合はNUMBER(p,s)の形式で、浮動小数点数を格納する場合はNUMBERの形式で記述します。小数型のフィールドには
DECIMALの使用を推奨し、BINARY_FLOATおよびBINARY_DOUBLEの使用は推奨しません。BINARY_FLOATとBINARY_DOUBLEは格納時に精度が損なわれる可能性があり、値の比較時に誤った結果が得られる可能性が高いです。暗黙的型変換時の優先順位
BINARY_DOUBLEの優先順位が最も高く、次にBINARY_FLOAT、最後にNUMBERとなります。数値フィールドの値の範囲
型値の範囲長さ(バイト)NUMBER 1.0 E-130F ~ 1.0 E +126 F(1.0 E +126 F は除く) 4~40 BINARY_FLOAT 1.17549E-38F ~ 3.40282E+38F 4 BINARY_DOUBLE 2.22507485850720E-308 ~ 1.79769313486231E+308 8
文字型フィールド
VARCHAR2の使用を推奨します。VARCHAR2型を比較する場合は、非補完空白モードで比較します。CHAR型を比較する場合は、補完空白モードで比較します。日付時刻フィールド
TIMESTAMP WITH TIME ZONEとTIMESTAMP WITH LOCAL TIME ZONEの2種類はタイムゾーンを認識します。タイムゾーンの違いにご注意ください。時刻フィールドのデータ型として文字を使用することは推奨されません。使用すると暗黙的型変換が発生しやすくなります。
その他
自動インクリメント列:ストレージオーバーフローを防ぐため、int型の使用は禁止され、必ずbigint型を使用してください。
外部キーの自己参照や、テーブルフィールド制約による連鎖削除・更新を定義することは禁止されています。これは重複削除を回避するためです。
列挙型列の使用は可能な限り避けてください:
enum('x','y','z'),は文字列型に置き換えてください。フィールドの意味を変更したり、フィールドが表す状態に追加情報を追加したりする際は、フィールドコメントを適時更新してください。
パフォーマンス向上のため、フィールドには適度な冗長性を許容しますが、データ同期の状況を考慮する必要があります。冗長フィールドは以下の点に従う必要があります:
頻繁に変更されないフィールド
超長フィールドではない
暗黙的な型変換が発生する場合、数値型の優先順位は時系列型よりも低く、文字列およびその他すべてのデータ型よりも高い。
適切な文字列の格納長は、データベーステーブルのスペースとインデックスのストレージを節約するだけでなく、何よりも検索速度を向上させる。
無符号値は負の数の誤った格納を避けることができ、表現範囲を拡大します。異なる数値範囲には異なるデータ型を推奨します。例:
対象年齢区間型表現範囲人 150歳以内 unsigned tinyint 無符号値:0 から 255。 カメ 数百年 unsigned smallint 無符号値:0 から 65535。 恐竜の化石 約数千万年 unsigned int 無符号値:0 から約43億。 太陽 約50億年 unsigned bigint 無符号値:0 から約10の19乗。