데이터 무결성(data integrity)은 저장된 데이터가 정확하고 일관되며 믿을 수 있는 상태로 유지되는 것이다. 재고가 100개로 보이는데 실제로 50개라면 무결성이 깨진 것이다. 관계형 DB는 이를 제약 조건(constraint)으로 강제한다.
네 가지 무결성
- 개체 무결성(entity integrity): 각 행을 유일하게 식별할 수 있어야 한다. 기본키(primary key)는 NULL이 될 수 없고 중복될 수 없다
- 참조 무결성(referential integrity): 외래키(foreign key)는 실제로 존재하는 행을 가리켜야 한다. 없는 고객을 가리키는 주문(고아 레코드, orphan record)을 허용하지 않는다
- 도메인 무결성(domain integrity): 값은 정해진 타입·범위·형식을 따라야 한다. 나이에 음수, 날짜 칸에 문자열은 안 된다
- 사용자 정의 무결성(user-defined integrity): 위로 표현되지 않는 업무 규칙. 예: 할인율은 0~50%
CREATE TABLE orders (
id bigint PRIMARY KEY, -- 개체
customer_id bigint NOT NULL REFERENCES customers(id), -- 참조
quantity int NOT NULL CHECK (quantity > 0), -- 도메인
discount numeric CHECK (discount BETWEEN 0 AND 0.5) -- 업무 규칙
);어디서 지킬까
애플리케이션 검증(Bean Validation, DRF 시리얼라이저)만으로는 부족하다. 다른 앱, 배치, 직접 실행한 SQL은 그 검증을 거치지 않는다. 마지막 방어선은 DB 제약에 두고, 앱 검증은 친절한 오류 메시지를 위해 쓴다. 유효하지 않은 상태를 아예 표현할 수 없게 만든다는 점에서 값 객체와 같은 생각이다.
ACID와의 관계
무결성은 지키려는 목표이고, ACID는 동시 실행과 장애 속에서도 그 목표를 트랜잭션 단위로 보장하는 수단이다. 중복 저장으로 생기는 갱신 이상(update anomaly)을 구조적으로 줄이는 방법은 정규화다.