整合性
Integrity
データベース内に保存されているデータに矛盾や欠落がなく、システム全体を通して一貫して正しい状態(ルールや制約を満たした状態)が保たれていること。
🐾 猫で例えると?
こちらを見つめる茶トラの情報を、猫の名簿に登録すると考えてみましょう。「同じ猫IDが二つない」「ごはんの記録は名簿にいる猫を指す」と約束を決めます。この約束をすべての記録が守り、食い違いがない状態がデータの整合性です。
💻 データベース開発における「整合性」とは?
整合性を考えるときは、まず業務上のルールを決めます。例えば、在庫の範囲でのみ販売するECサイトなら、注文によって在庫が負になる状態を防ぐ必要があります。振込を一組の更新として扱うなら、出金だけが確定して入金が反映されない状態も避けます。こうしたルールに反する状態がデータ不整合です。
これらの不整合を防ぐため、データベース管理システム(RDBMS)には、データが常に正しい状態を保つための強固なルール(制約)を設ける機能が備わっています。テーブル設計の段階でこれらのルールを正しく定義することが、エンジニアの腕の見せ所となります。
⚠️ 整合性を守る仕組みと注意点
データの整合性は、主にデータベース側の「制約(Constraint)」と、アプリケーション側の「トランザクション制御」の2段構えで守られます。
外部キー制約と参照整合性
社員の部署IDが部署テーブルを参照する例では、外部キーが存在しないIDの登録を防ぎます。ただしNULLを許す列なら未所属を表現できますし、参照先を削除した際の動作も制約の指定によって変わります。
-- PostgreSQLの検証用DBでの例
CREATE TABLE departments (id INT PRIMARY KEY);
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
age INT CHECK (age >= 0),
department_id INT REFERENCES departments(id)
);
-- ageやdepartment_idはNOT NULLがないためNULLを許す CHECKは業務上の正解をすべて知っているわけではありません。この例で誤った年齢を正の値として登録すれば通ります。制約が防ぐ誤りと、入力・業務処理で検証する内容を分けて設計します。
🛠️ 整合性を賢く維持するためのポイント
高い整合性を保ちながら、システムを安定稼働させるためのベストプラクティスです。
- データベースの制約をフル活用する: アプリケーション側のプログラム(PHPやJavaなど)だけでデータのチェックを行うのではなく、NOT NULL制約や外部キー制約など、DB側の機能を併用して堅牢なデータ構造を築きます。
- 一緒に確定すべき更新をまとめる: 送金の引落しと入金など、片方だけの成功を許さない操作をトランザクションにまとめます。別サービスまで含む更新は、通常の単一DBトランザクションだけでは扱えない場合があります。
- 非正規化のリスクを理解する: パフォーマンス向上のためにあえてテーブルを分割しない(非正規化する)場合、データが重複して保存されるため、更新時の整合性維持が難しくなります。トレードオフを慎重に判断する必要があります。
茶トラの顔を見ていつもの様子を確かめるように、データにも「正しい状態」の基準が必要です。在庫を負にしない、存在する会員だけに注文を結び付けるなど、守るルールを具体化しましょう。DBの制約とトランザクションを使い、関連する更新が途中だけ残らないようにします。