data/database

[데이터베이스] 04. 관계 데이터 모델

렁치 2026. 8. 18. 15:39

관계 데이터 모델은 데이터를 표(테이블)의 형태로 다룬다. 이 단순한 아이디어가 수십 년째 데이터베이스 세계를 지배하고 있다.

단순해 보이는 표 뒤에는 정밀하게 정의된 용어와, 데이터가 망가지지 않게 지키는 규칙(무결성)이 있다. 오늘은 그 어휘와 규칙을 정리했다. 데이터베이스를 다루는 거의 모든 이야기가 결국 이 용어들 위에서 이뤄지기 때문이다.


1. 릴레이션의 구성

관계 모델에서는 표를 릴레이션(relation)이라 부르고, 행과 열에도 고유한 이름을 붙인다. 일상의 "표/행/열" 용어와 짝지어 외워두니 편했다.

용어 의미 일상 표현
릴레이션(relation) 행과 열로 구성된 표 테이블
속성(attribute) 릴레이션의 열 컬럼(세로)
튜플(tuple) 릴레이션의 행 로우(가로)
도메인(domain) 한 속성이 가질 수 있는 모든 값의 집합 값의 허용 범위
차수(degree) 속성(열)의 전체 개수 열 수
카디널리티(cardinality) 튜플(행)의 전체 개수 행 수

차수와 카디널리티 구분
차수는 열의 수, 카디널리티는 행의 수다. 차수는 표를 설계할 때 정해지면 잘 안 변하지만(구조에 해당), 카디널리티는 데이터를 넣고 빼면서 계속 변한다(내용에 해당). 그래서 맨 위 속성 이름 줄은 표의 구조(릴레이션 스키마)를, 그 아래 실제 데이터 행들은 그 시점의 내용(릴레이션 인스턴스)을 나타낸다.

도메인은 다소 추상적이지만 중요하다. "성별" 속성의 도메인이 {남, 여}라면, 거기에 "北"이나 숫자 3이 들어가는 건 막아야 한다. 이렇게 "각 속성의 값은 정해진 도메인 안에 있어야 한다"는 약속이 데이터 품질의 1차 방어선이다.

널(NULL)
속성 값이 아직 알려지지 않았거나(unknown), 해당 사항이 없음(not applicable)을 나타내는 특별한 표식이다. 숫자 0이나 빈 문자열과는 다르다. 0은 "값이 0이라고 아는 것"이고, NULL은 "값을 모르거나 없는 것"이다. 이 차이가 집계·비교 연산에서 미묘한 결과를 낳는다(아래 '한 걸음 더' 참고).

2. 키 (Key)

키는 수많은 튜플 중에서 원하는 행을 유일하게 식별하기 위한 속성(들)이다. 키를 이해하는 두 잣대는 유일성과 최소성이다.

  • 유일성: 그 값으로 튜플이 하나로 특정되는가?
  • 최소성: 식별에 꼭 필요한 속성만으로 이루어졌는가? (군더더기가 없는가?)
정의 유일성 최소성
슈퍼키(super key) 튜플을 유일하게 식별 O X
후보키(candidate key) 식별하면서 군더더기도 없음 O O
기본키(primary key) 후보키 중 대표로 택한 하나 O O
대체키(alternate key) 기본키로 뽑히지 못한 후보키 O O
외래키(foreign key) 다른 릴레이션의 기본키를 참조하는 속성 (연결용) (연결용)

흐름으로 보니 이렇게 이어졌다.

  • {학번, 이름}은 학번만으로도 식별되는데 이름까지 붙였으니, 유일성은 있어도 최소성이 없는 슈퍼키다.
  • 여기서 군더더기를 쳐내 {학번}, {주민번호}처럼 더는 줄일 수 없는 식별자가 후보키다.
  • 후보키가 여럿이면 그중 대표 하나를 기본키로 정하고(예: 학번), 뽑히지 못한 나머지(주민번호)는 대체키가 된다.

즉 슈퍼키, 후보키, 기본키로 갈수록 조건이 까다로워지는 포함 관계라고 보면 된다.

외래키는 성격이 다르다. 식별이 아니라 연결을 위한 키다. 한 부서에 여러 사원이 속하는 1:N 관계에서, 사원 테이블이 자기 소속 부서를 가리키려고 부서 테이블의 기본키(부서번호)를 참조하는 식이다.

관계형 모델이 데이터 사이의 관계를 "값의 일치"로 표현하는데, 그 일치를 실제로 구현하는 장치가 바로 외래키다.


3. 무결성 제약조건

무결성(integrity) 제약조건은 데이터베이스에 모순되거나 잘못된 데이터가 들어가지 못하게 막는 규칙이다. 세 가지가 핵심이다.

무결성 규칙
개체 무결성 기본키는 NULL일 수 없고, 중복될 수 없다
참조 무결성 외래키는 참조하는 릴레이션의 기본키 값이거나 NULL이어야 한다
도메인 무결성 각 속성 값은 정의된 도메인에 속해야 한다

이 규칙들이 왜 필요한지는 "어기면 무슨 일이 벌어지는가"로 이해하니 분명해졌다.

  • 개체 무결성을 어겨 기본키가 NULL이면, 그 행을 가리킬 방법이 사라진다. 식별자가 없는 행은 다른 행과 구별할 수도, 외래키로 참조할 수도 없는 유령이 된다.
  • 참조 무결성을 어기면, 사원 테이블의 부서번호가 부서 테이블에 존재하지 않는 값을 가리키게 된다. 소속이 "유령 부서"인 사원이 생기는 것이다(dangling reference). 그래서 외래키는 반드시 실재하는 기본키 값이거나, 아직 정해지지 않았음을 뜻하는 NULL이어야 한다.

무결성 제약은 "사람이 실수로라도 모순된 데이터를 못 넣게" DBMS가 강제하는 안전장치다. 데이터베이스의 목적이 데이터를 정확하게 정보로 만드는 데 있다면, 그 정확성의 토대가 바로 이 무결성이다.


오늘 느낀 점

  • 키 종류가 많아 헷갈렸는데, "유일성 + 최소성"이라는 두 잣대로 슈퍼키→후보키→기본키의 포함 관계를 잡으니 한 번에 정리됐다.
  • 무결성 규칙을 "어기면 무슨 일이 생기나"로 거꾸로 보니, 규칙이 자의적이지 않고 전부 필연이라는 게 보였다.
  • 외래키가 "식별"이 아니라 "연결"용이라는 구분이 중요했다. 관계형 모델이 관계를 값의 일치로 표현한다는 말이 외래키에서 손에 잡혔다.

한 걸음 더

  • 관계 모델은 1970년 에드거 코드(E. F. Codd)가 집합론에 기반해 제안했다. "릴레이션"이라는 이름도 표를 예쁘게 부른 말이 아니라 수학의 관계(relation, 튜플들의 집합)에서 온 것이다. 그래서 이론상 릴레이션에는 행의 순서가 없고 중복 행도 없다(집합이니까). 다만 실제 SQL 테이블은 편의상 이 규칙을 느슨하게 풀어 중복 행이나 정렬을 허용한다. 이론과 구현의 간극이 여기서도 보인다.
  • NULL은 비교 연산에서 함정을 만든다. SQL에서 NULL = NULL의 결과는 참(true)이 아니라 알 수 없음(unknown)이다. "모르는 값"과 "모르는 값"이 같은지는 알 수 없기 때문이다. 그래서 NULL 여부는 =이 아니라 IS NULL로 검사해야 하고, 이 3값 논리(true/false/unknown)는 처음 SQL을 배울 때 가장 많이 걸려 넘어지는 지점이다.
  • 참조 무결성은 정적인 규칙에 그치지 않는다. 참조되던 부서가 삭제되면 그 부서 소속 사원의 외래키는 어떻게 될까? SQL은 ON DELETE CASCADE(딸린 사원도 함께 삭제), SET NULL(소속을 NULL로), RESTRICT(사원이 있으면 삭제 거부) 같은 옵션으로 이 연쇄 동작을 지정한다. 무결성을 "어떻게 유지할지"까지 DBMS가 책임지는 것이다.