CHAPTER 1 / 8
관계형 모델과 일관성
관계형 모델의 힘은 표 모양보다 논리적 관계와 constraint를 물리 저장 방식에서 분리한 데 있습니다.
이 개념이 필요해진 배경
Primary key, foreign key와 constraint는 여러 application이 같은 data 규칙을 공유하게 합니다. Transaction은 관련 변경을 하나의 단위로 commit하거나 rollback해 중간 상태 노출을 통제합니다.
Schema가 변경을 방해하는 것이 아니라 어떤 변경이 기존 계약을 깨는지 드러냅니다. 다만 고정 schema와 join이 모든 접근 패턴에 최적인 것은 아니며 workload와 확장 조건을 측정해야 합니다.
관계형 모델의 힘은 표 모양보다 논리적 관계와 constraint를 물리 저장 방식에서 분리한 데 있습니다.
Declarative query와 constraint, transaction이 data 관계와 일관성을 database에서 enforce합니다.
Constraint를 우회한 invalid row와 동시 transaction을 주입해 거부·rollback을 확인합니다.
구체적인 시스템에서 따라가기
주문 시스템에서 `orders.customer_id`가 존재하지 않는 고객을 가리키지 못하게 하는 foreign key는 화면 한 곳의 validation보다 강한 공유 규칙입니다. 관리자 도구, batch job과 새 mobile API가 모두 같은 database를 사용해도 제약은 동일하게 적용됩니다. Unique constraint는 같은 결제 식별자의 중복 저장을 막고, check constraint는 수량이나 상태 값의 허용 범위를 data 가까이에서 지킵니다.
Transaction의 의미는 query 여러 개를 빠르게 묶는 것이 아니라 외부에 보일 상태 전환을 정의하는 데 있습니다. 재고를 줄인 뒤 주문 생성이 실패하면 두 변경을 rollback해야 하고, 동시에 두 사용자가 마지막 재고를 주문할 때는 isolation 수준과 lock 방식이 어떤 결과를 허용하는지 알아야 합니다. 단순히 transaction을 사용했다는 사실만으로 모든 동시성 문제가 사라지지는 않습니다.
Schema migration도 “컬럼을 추가했다”에서 끝나지 않습니다. 구 version과 신 version application이 함께 실행되는 rolling deployment에서는 먼저 호환 가능한 column을 추가하고 data를 backfill한 뒤 읽기 경로를 전환하고 마지막에 제약을 강화하는 단계가 필요합니다. 큰 table의 validation과 index build는 lock과 I/O를 만들 수 있으므로 실제 data 규모에서 소요 시간과 차단 범위를 측정해야 합니다.
관계형 모델을 선택하지 말아야 할 조건도 있습니다. 관계와 transaction보다 하나의 aggregate를 통째로 읽고 쓰는 접근이 대부분이고 schema가 매우 빠르게 달라지거나 지역 간 가용성이 강한 우선순위라면 다른 저장 모델이 더 단순할 수 있습니다. 다만 “join이 느리다”는 추측만으로 분리하기보다 query plan, cardinality, consistency 요구와 장애 복구 방식을 같은 workload에서 비교해야 합니다.
선택 기준과 실패 경계
Migration, lock, scale topology와 엄격한 modeling 비용이 있습니다.
피해야 할 오해: RDB는 단순한 spreadsheet이고 확장할 수 없다는 생각은 틀립니다.
직접 검증하기
Constraint를 우회한 invalid row와 동시 transaction을 주입해 거부·rollback을 확인합니다.
이 장의 공식 출처
본문의 기술 사실은 다음 1차 자료를 기준으로 검토했습니다. 도해와 비교는 이 자료를 바탕으로 저자가 재구성했습니다.
- IBM Research, 「A Relational Model of Data for Large Shared Data Banks」검토일 2026-08-28 · 적용 범위 1970년 원 논문
- PostgreSQL Global Development Group, 「Constraints」검토일 2026-08-28 · 적용 범위 PostgreSQL 18 / current
- PostgreSQL Global Development Group, 「Concurrency Control: Introduction」검토일 2026-08-28 · 적용 범위 PostgreSQL 18 / current