1. 관계형 데이터베이스의 기본 구조
관계형 데이터베이스는 데이터를 테이블 형태로 저장하는 방식이다.
우리가 흔히 보는 행과 열 구조가 바로 관계형 모델의 핵심이다.
여기서 중요한 용어 몇 개를 먼저 정리하고 가면 이해가 훨씬 쉬워진다.
- 릴레이션(Relation): 튜플들의 집합
- 튜플(Tuple): 하나의 행(row), 즉 속성값들의 집합
- 속성(Attribute): 열(column), 각 데이터 항목의 이름
- 도메인(Domain): 각 속성이 가질 수 있는 허용된 값의 집합
예를 들어 학생 테이블이 있다고 해보자.
| 2024001 | 김민수 | 컴퓨터학과 |
| 2024002 | 이서연 | 경영학과 |
여기서
- 테이블 전체는 릴레이션
- 각 행은 튜플
- 학번, 이름, 학과는 속성
- 학과 속성에 들어갈 수 있는 값들의 범위는 도메인
이라고 보면 된다.
2. 릴레이션 스키마와 릴레이션 인스턴스
이 부분은 ch.1의 스키마 / 인스턴스 개념이 그대로 이어진다.
릴레이션 스키마(Relation Schema)
릴레이션의 구조를 정의하는 틀이다.
즉, 테이블 이름, 속성 이름, 타입, 도메인 등을 정의한 설계도라고 보면 된다.
예:
이건 student 테이블이 어떤 속성들로 구성되는지 보여주는 스키마다.
릴레이션 인스턴스(Relation Instance)
어느 시점에 실제로 테이블 안에 들어 있는 튜플들의 집합이다.
즉,
- 스키마 = 구조
- 인스턴스 = 실제 데이터
이렇게 구분하면 된다.
3. 속성, 튜플, 도메인 개념 정리
속성(Attribute)
테이블의 열(column)이다.
데이터의 한 항목을 의미한다.
예:
- 학번
- 이름
- 전화번호
- 학과명
속성의 개수를 degree(차수) 라고도 부른다.
예를 들어 속성이 4개면 그 릴레이션의 차수는 4다.
튜플(Tuple)
테이블의 한 행(row)이다.
하나의 데이터 레코드라고 생각하면 된다.
튜플 수는 cardinality(기수) 라고 한다.
즉,
- 차수(degree) = 열 개수
- 기수(cardinality) = 행 개수
이 둘은 자주 헷갈리니까 구분해두는 게 좋다.
도메인(Domain)
각 속성이 가질 수 있는 허용된 값의 범위다.
예를 들어 나이 속성의 도메인은 정수일 수 있고,
학년 속성의 도메인은 1, 2, 3, 4처럼 제한될 수도 있다.
관계형 모델에서는 일반적으로 각 속성의 값이 원자적(atomic) 이어야 한다.
즉, 더 이상 쪼갤 수 없는 단일 값이어야 한다는 뜻이다.
예를 들어 전화번호 속성에 여러 개 번호를 한 번에 넣는 건 관계형 모델 관점에서는 적절하지 않다.
NULL 값
NULL은 그냥 빈 값이 아니라,
- 아직 모르는 값
- 존재하지 않는 값
을 나타내는 특별한 값이다.
예를 들어 학생의 연락처가 아직 등록되지 않았다면 NULL이 들어갈 수 있다.
4. 키의 종류 정리

관계형 데이터베이스에서는 각 튜플을 구분하고, 테이블 사이 관계를 맺기 위해 키(Key) 개념이 매우 중요하다.
1) 슈퍼키(Super Key)
튜플을 유일하게 식별할 수 있는 속성들의 집합이다.
단, 꼭 최소일 필요는 없다.
즉, 필요 없는 속성이 더 들어가 있어도 유일성만 만족하면 슈퍼키다.
예를 들어 학생 테이블이 있고 속성이 다음과 같다고 해보자.
- 학번
- 이름
- 전화번호
이때 가능한 슈퍼키 예시는:
- {학번}
- {학번, 이름}
- {학번, 전화번호}
- {학번, 이름, 전화번호}
이처럼 유일성만 만족하면 다 슈퍼키다.
2) 후보키(Candidate Key)
슈퍼키 중에서 최소성까지 만족하는 키다.
즉,
- 유일해야 하고
- 불필요한 속성이 없어야 한다
예를 들어 학생 테이블에서
- {학번}
- {전화번호}
둘 다 각 학생을 유일하게 구분할 수 있다면 둘 다 후보키가 될 수 있다.
3) 기본키(Primary Key)
후보키 중에서 대표로 선택된 키다.
기본키는 다음 조건을 만족해야 한다.
- 중복 불가
- NULL 불가
그래서 보통 NOT NULL 과 UNIQUE 성격을 함께 가진다.
기본키를 정할 때는 보통 이런 기준을 고려한다.
- 값이 잘 바뀌지 않는가
- 단순한가
- 짧고 관리하기 쉬운가
4) 외래키(Foreign Key)
한 테이블에서 다른 테이블의 키를 참조하는 속성이다.
쉽게 말하면 테이블과 테이블을 연결하는 다리 같은 역할이다.
예를 들어 학생 테이블에 학과명이 있고,
학과 테이블에 학과명이 기본키라면 학생 테이블의 학과명은 학과 테이블을 참조하는 외래키가 될 수 있다.
외래키의 특징은 이렇다.
- 중복 가능
- NULL 가능
- 반드시 참조 대상 테이블에 존재하는 값이어야 함
즉, 부모 테이블에 없는 값을 자식 테이블에서 마음대로 넣으면 안 된다.
5) 대체키(Alternate Key)
후보키 중에서 기본키로 선택되지 않은 나머지 키를 말한다.
예를 들어 후보키가 {학번}, {전화번호} 두 개이고,
기본키를 {학번}으로 골랐다면 {전화번호}는 대체키가 된다.
5. 관계대수(Relational Algebra)란?
관계대수는 관계형 데이터베이스에서 데이터를 질의하는 형식적 연산 체계다.
쉽게 말하면,
“테이블에서 원하는 데이터를 어떻게 뽑아낼지”를 수학적으로 표현한 방식이다.
관계대수는 절차적 질의어에 가깝다.
즉, 어떤 데이터를 얻을지뿐 아니라 어떻게 얻는지도 표현한다.
SQL을 배우기 전에 관계대수를 배우는 이유는,
관계형 데이터베이스가 내부적으로 어떤 방식으로 연산을 생각하는지 이해하는 데 도움이 되기 때문이다.
6. 기본 관계 연산자

관계대수의 기본 연산자는 크게 단항 연산과 이항 연산으로 나뉜다.
단항 연산
하나의 릴레이션에 대해 수행하는 연산이다.
1) 선택(Select, σ)
조건을 만족하는 튜플만 골라낸다.
SQL의 WHERE와 비슷하다.
예:
- 급여가 50000 이상인 교수만 선택
즉, 행을 고르는 연산이라고 생각하면 된다.
2) 추출(Project, π)
원하는 속성만 뽑아낸다.
SQL의 SELECT 컬럼명과 비슷하다.
예:
- 교수 테이블에서 이름과 학과만 추출
즉, 열을 고르는 연산이다.
3) 재명명(Rename, ρ)
릴레이션이나 속성 이름을 임시로 바꾼다.
이 연산은 특히 같은 테이블을 두 번 비교할 때 중요하다.
즉, 셀프 조인 같은 상황에서 많이 쓴다.
같은 테이블끼리 비교하는 이유: 셀프 조인 아이디어
예를 들어 “가장 높은 연봉을 받는 교수”를 찾고 싶다고 해보자.
이럴 때 한 테이블 안의 데이터를 그 테이블 자체와 비교해야 한다.
그래서 같은 릴레이션을 하나 더 복사한 것처럼 재명명해서 사용한다.
과정은 이렇게 이해하면 된다.
- instructor를 하나 더 만들어 d라고 이름 붙인다.
- instructor × d 로 모든 교수-교수 조합을 만든다.
- instructor.salary < d.salary 조건을 만족하는 경우를 찾는다.
- 그러면 “자신보다 더 높은 연봉을 가진 사람이 있는 교수”가 나온다.
- 이들을 전체 교수 목록에서 빼면, 최종적으로 최고 연봉자만 남는다.
이 예시는 관계대수에서 카티션 곱 + 선택 + 차집합이 어떻게 결합되는지 보여줘서 꽤 중요하다.
이항 연산
두 개의 릴레이션을 대상으로 수행하는 연산이다.
1) 합집합(Union, ∪)
두 릴레이션의 결과를 합친다.
단, 합집합을 하려면 두 릴레이션의 구조가 호환되어야 한다.
즉, 속성 개수와 타입이 맞아야 한다.
2) 차집합(Set Difference, -)
한 릴레이션에는 있고 다른 릴레이션에는 없는 튜플만 남긴다.
3) 카티션 곱(Cartesian Product, ×)
두 릴레이션의 모든 튜플 조합을 만든다.
예를 들어 A에 3개 행, B에 4개 행이 있으면
A × B 결과는 12개 행이 된다.
카티션 곱 자체만 단독으로 쓰기보다는,
보통 이후에 선택 조건을 걸어서 조인처럼 활용하는 경우가 많다.
7. 확장 관계 연산자와 조인
기본 연산 외에도 자주 쓰는 확장 연산이 있다.
1) 배정(Assignment, ←)
중간 결과를 변수처럼 저장해서 다음 연산에 활용할 때 쓴다.
복잡한 관계대수 식을 단계별로 표현할 때 유용하다.
2) 교집합(Intersection, ∩)
두 릴레이션에 공통으로 포함된 튜플만 남긴다.
3) 조인(Join)
관계형 데이터베이스에서 제일 중요한 연산 중 하나다.
서로 관련 있는 두 테이블을 연결해서 새로운 결과를 만든다.
자연 조인(Natural Join, ⨝)
이름이 같은 속성을 기준으로 자동으로 조인한다.
장점은 간단하다는 거지만,
원하지 않는 같은 이름의 속성까지 기준으로 잡힐 수 있어서 조심해야 한다.
세타 조인(Theta Join, ⨝θ)
조건을 명시해서 조인하는 방식이다.
예를 들어
- student.dept_name = department.dept_name
같은 조건을 직접 줘서 조인한다.
세타 조인에서 조건이 = 인 경우를 동등 조인(Equal Join) 이라고 한다.
외부 조인(Outer Join)
일치하는 값이 없어도 한쪽 테이블의 튜플을 유지하고 싶을 때 사용한다.
종류는 다음과 같다.
- 왼쪽 외부 조인(Left Outer Join, ⟕)
왼쪽 릴레이션의 모든 튜플 유지 - 오른쪽 외부 조인(Right Outer Join, ⟖)
오른쪽 릴레이션의 모든 튜플 유지 - 전체 외부 조인(Full Outer Join, ⟗)
양쪽 릴레이션의 모든 튜플 유지
이건 SQL의 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN과 연결해서 이해하면 된다.
8. 관계 해석(Relational Calculus)
노트에 짧게 정리된 부분인데, 개념만 같이 잡고 가면 좋다.
관계 해석은 관계대수와 달리 선언형 질의어다.
즉, 결과로 무엇을 원하는지를 표현하는 방식이다.
종류는 두 가지다.
- 튜플 관계 해석
- 도메인 관계 해석
관계대수는 “어떻게 구할지”에 초점이 있고,
관계 해석은 “무엇을 구할지”에 초점이 있다고 보면 된다.
SQL은 완전히 관계대수도 아니고 완전히 관계해석도 아니지만,
전체적으로는 선언형 질의어에 더 가깝다.
9. 무결성과 제약조건
데이터베이스에서 무결성은
데이터가 정확하고 일관되게 유지되는 성질을 의미한다.
아무 값이나 막 들어가면 데이터베이스는 금방 망가진다.
그래서 제약조건을 통해 데이터를 보호해야 한다.
1) 개체 무결성(Entity Integrity)
기본키는 각 행을 유일하게 식별해야 하므로
- 중복되면 안 되고
- NULL이면 안 된다
즉, 기본키의 무결성을 보장하는 규칙이다.
2) 참조 무결성(Referential Integrity)
외래키는 반드시 참조 대상 테이블에 존재하는 값을 가져야 한다.
예를 들어 학생 테이블에 없는 학과를 참조하면 안 된다.
즉,
- 존재하지 않는 부모 키를 참조하면 안 됨
- 테이블 간 관계가 일관되게 유지되어야 함
3) 도메인 무결성(Domain Integrity)
각 속성은 자신의 도메인에 맞는 값만 가져야 한다.
예를 들어:
- 학점에 문자 넣으면 안 됨
- 주민번호 자리에 알파벳 넣으면 안 됨
- 나이는 음수가 되면 안 됨
이런 규칙은 CHECK, 타입 제한 등으로 보장할 수 있다.
외래키 제약조건에서 중요한 점
외래키는 단순히 “참조한다”로 끝나는 게 아니라,
부모 테이블과 자식 테이블의 변화에 따라 제약이 생긴다.
1) 삽입 / 수정 제한
부모 테이블에 없는 값을 외래키로 넣을 수 없다.
2) 삭제 제한
부모 테이블의 행을 삭제하려면
자식 테이블에서 그 값을 참조하고 있는 행도 함께 고려해야 한다.
3) ON DELETE / ON UPDATE 옵션
부모 값이 삭제되거나 수정될 때 자식 쪽을 어떻게 처리할지 정할 수 있다.
예:
- CASCADE
- SET NULL
- RESTRICT
이 부분은 실제 SQL에서 외래키 제약조건 설정할 때 굉장히 중요하다.
10. 문제로 다시 보는 핵심 포인트
릴레이션 인스턴스 vs 릴레이션 스키마
이 둘은 꼭 구분해야 한다.
- 릴레이션 스키마: 속성 이름, 타입, 도메인을 정의한 구조
- 릴레이션 인스턴스: 실제 시점의 데이터 집합
즉, 설계도와 실제 데이터의 차이다.
주 키는 왜 중요한가?
주 키는 각 튜플을 유일하게 식별해야 하므로
중복되거나 NULL이면 안 된다.
그래서 다음 같은 경우는 허용되지 않는다.
- 주 키 값이 중복되는 경우
- 속성 도메인에 없는 값이 들어가는 경우
advisor 릴레이션 예시
s_id만으로 advisor 릴레이션의 기본키가 될 수 있는지 생각해보면,
답은 안 된다.
왜냐하면 한 학생이 여러 지도교수를 가질 수 있기 때문이다.
예:
| 1001 | 2001 |
| 1001 | 2002 |
이 경우 s_id만으로는 유일성을 보장하지 못한다.
그래서 기본키는 보통 {s_id, i_id} 같은 복합키가 된다.
이 예시는 “유일성”이 실제로 어떤 뜻인지 이해하는 데 꽤 좋다.
11. 핵심 요약
이번 챕터 핵심만 다시 정리하면 이렇다.
- 릴레이션은 튜플의 집합이고, 튜플은 하나의 행이다.
- 속성은 열이고, 각 속성은 자신만의 도메인을 가진다.
- 릴레이션 스키마는 구조, 릴레이션 인스턴스는 실제 데이터다.
- 슈퍼키는 유일성만 만족, 후보키는 유일성과 최소성 모두 만족한다.
- 기본키는 후보키 중 대표 키, 외래키는 다른 테이블을 참조하는 키다.
- 관계대수의 기본 연산은 선택, 추출, 재명명, 합집합, 차집합, 카티션 곱이다.
- 조인은 관계형 데이터베이스에서 테이블 간 관계를 다루는 핵심 연산이다.
- 무결성은 개체 무결성, 참조 무결성, 도메인 무결성으로 구분해 이해하면 된다.
마무리
관계형 데이터베이스 2장 정리: “테이블 구조를 어떻게 이해할 것인가”에 대한 챕터
1장에서 데이터베이스가 왜 필요한지 배웠다면, 2장에서는 이제 그 데이터가 어떤 구조로 저장되고, 그 구조 안에서 키와 관계, 제약조건이 어떤 역할을 하는지 본격적으로 배운다.
특히 여기서 나오는
- 릴레이션
- 튜플
- 속성
- 키
- 관계대수
- 무결성
내용은 뒤에서 SQL, 정규화, ERD, 스키마 설계 배울 때 계속 나온다!! 개념을 정확히 잡아두자.