관계 데이터 모델
관계 데이터 모델 (Relational Data Model)
관계 데이터 모델은 하나의 개체에 관한 데이터를 릴레이션(relation) 하나에 담아 데이터베이스에 저장하는 논리적 데이터 모델이다.
1. 기본 용어
릴레이션 예제: 고객 테이블
┌─────────────────────────────────────────────────────────────┐
│ 고객 (릴레이션) │
├──────────┬──────────┬─────────────┬────────────────────────┤
│ 고객번호 │ 이름 │ 등급 │ 연락처 │ ← 속성(Attribute)
├──────────┼──────────┼─────────────┼────────────────────────┤
│ C001 │ 홍길동 │ VIP │ 010-1234-5678 │ ← 투플(Tuple)
│ C002 │ 김철수 │ Gold │ 010-2345-6789 │
│ C003 │ 이영희 │ Silver │ 010-3456-7890 │
│ C004 │ 박민수 │ VIP │ NULL │
└──────────┴──────────┴─────────────┴────────────────────────┘
↑
도메인: 'C' + 3자리 숫자
차수(Degree): 4 (속성 개수)
카디널리티(Cardinality): 4 (투플 개수)용어 정리
| 용어 | 설명 | 파일 시스템 대응 | 예시 |
|---|---|---|---|
| 릴레이션(Relation) | 2차원 테이블 구조 | 파일 | 고객, 주문, 상품 |
| 속성(Attribute) | 릴레이션의 열 | 필드 | 고객번호, 이름, 등급 |
| 투플(Tuple) | 릴레이션의 행 | 레코드 | 각 고객의 데이터 |
| 도메인(Domain) | 속성이 가질 수 있는 모든 값의 집합 | 데이터 타입 | 등급: {VIP, Gold, Silver} |
| 널(NULL) | 값을 모르거나 해당 없음 | - | 연락처 미등록 |
| 차수(Degree) | 속성의 개수 | - | 4 (정적) |
| 카디널리티(Cardinality) | 투플의 개수 | - | 4 (동적) |
도메인 상세
속성별 도메인 예시:
고객번호: { 'C001', 'C002', 'C003', ... } -- 문자 'C' + 3자리 숫자
이름: { 문자열, 최대 50자 }
등급: { 'VIP', 'Gold', 'Silver', 'Bronze' } -- 열거형
연락처: { 전화번호 형식 또는 NULL }원자 값(Atomic Value): 관계 데이터 모델에서 속성 값은 더 이상 분해할 수 없는 원자 값만 사용할 수 있다.
2. 릴레이션과 데이터베이스 구성
릴레이션 스키마 vs 릴레이션 인스턴스
┌─────────────────────────────────────────────────────────┐
│ 릴레이션 스키마 (Schema) = 논리적 구조 │
│ ───────────────────────────────────────────────────── │
│ 고객(고객번호, 이름, 등급, 연락처) │
│ │
│ 특징: 정적 (자주 변하지 않음) │
│ 별칭: 릴레이션 내포(Intension) │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 릴레이션 인스턴스 (Instance) = 실제 데이터 │
│ ───────────────────────────────────────────────────── │
│ (C001, 홍길동, VIP, 010-1234-5678) │
│ (C002, 김철수, Gold, 010-2345-6789) │
│ ... │
│ │
│ 특징: 동적 (삽입/삭제/수정으로 자주 변함) │
│ 별칭: 릴레이션 외연(Extension) │
└─────────────────────────────────────────────────────────┘데이터베이스 구성
데이터베이스 스키마
├── 고객(고객번호, 이름, 등급, 연락처)
├── 상품(상품번호, 상품명, 가격, 재고)
├── 주문(주문번호, 고객번호, 주문일, 총액)
└── 주문상세(주문번호, 상품번호, 수량)
데이터베이스 인스턴스
├── 고객 릴레이션 인스턴스 (4개 투플)
├── 상품 릴레이션 인스턴스 (100개 투플)
├── 주문 릴레이션 인스턴스 (500개 투플)
└── 주문상세 릴레이션 인스턴스 (1200개 투플)3. 릴레이션의 특성
3.1 투플의 유일성
하나의 릴레이션에는 동일한 투플이 존재할 수 없다.
올바른 릴레이션:
┌──────────┬──────────┬─────────┐
│ 고객번호 │ 이름 │ 등급 │
├──────────┼──────────┼─────────┤
│ C001 │ 홍길동 │ VIP │
│ C002 │ 김철수 │ Gold │ ← 모든 투플이 유일
│ C003 │ 이영희 │ Silver │
└──────────┴──────────┴─────────┘
잘못된 릴레이션:
┌──────────┬──────────┬─────────┐
│ 고객번호 │ 이름 │ 등급 │
├──────────┼──────────┼─────────┤
│ C001 │ 홍길동 │ VIP │
│ C002 │ 김철수 │ Gold │
│ C001 │ 홍길동 │ VIP │ ← 중복! 허용 안됨
└──────────┴──────────┴─────────┘3.2 투플의 무순서
투플 사이의 순서는 무의미하다.
다음 두 릴레이션은 동일하다:
릴레이션 A: 릴레이션 B:
┌──────────┬──────────┐ ┌──────────┬──────────┐
│ C001 │ 홍길동 │ │ C002 │ 김철수 │
│ C002 │ 김철수 │ = │ C001 │ 홍길동 │
│ C003 │ 이영희 │ │ C003 │ 이영희 │
└──────────┴──────────┘ └──────────┴──────────┘
→ 데이터베이스는 위치가 아닌 내용으로 검색3.3 속성의 무순서
속성 사이의 순서는 무의미하다.
다음 두 릴레이션은 동일하다:
릴레이션 A: 릴레이션 B:
┌──────────┬──────────┐ ┌──────────┬──────────┐
│ 고객번호 │ 이름 │ │ 이름 │ 고객번호 │
├──────────┼──────────┤ = ├──────────┼──────────┤
│ C001 │ 홍길동 │ │ 홍길동 │ C001 │
└──────────┴──────────┘ └──────────┴──────────┘
→ 속성 값은 이름으로 접근 (위치가 아님)
→ 같은 릴레이션에 동일한 속성 이름 불가3.4 속성의 원자성
속성 값으로 원자 값만 사용할 수 있다.
잘못된 릴레이션 (다중 값):
┌──────────┬──────────┬────────────────────────┐
│ 고객번호 │ 이름 │ 연락처 │
├──────────┼──────────┼────────────────────────┤
│ C001 │ 홍길동 │ 010-1234-5678, │ ← 다중 값! 허용 안됨
│ │ │ 02-123-4567 │
└──────────┴──────────┴────────────────────────┘
올바른 릴레이션 (정규화):
┌──────────┬──────────┬─────────┬────────────────┐
│ 고객번호 │ 이름 │ 연락처유형 │ 연락처 │
├──────────┼──────────┼─────────┼────────────────┤
│ C001 │ 홍길동 │ 휴대폰 │ 010-1234-5678 │
│ C001 │ 홍길동 │ 집 │ 02-123-4567 │
└──────────┴──────────┴─────────┴────────────────┘릴레이션 특성 요약
| 특성 | 설명 | 의미 |
|---|---|---|
| 투플의 유일성 | 중복 투플 없음 | 키로 구별 가능 |
| 투플의 무순서 | 행 순서 무의미 | 내용으로 검색 |
| 속성의 무순서 | 열 순서 무의미 | 이름으로 접근 |
| 속성의 원자성 | 단일 값만 허용 | 1NF 만족 |
4. 키 (Key)
키는 릴레이션에서 투플을 유일하게 구별하는 역할을 하는 속성 또는 속성들의 집합이다.
키의 특성
| 특성 | 설명 |
|---|---|
| 유일성(Uniqueness) | 키 값은 투플마다 달라야 함 (중복 불가) |
| 최소성(Minimality) | 꼭 필요한 최소한의 속성들로만 구성 |
4.1 키의 종류
학생 릴레이션
┌────────────┬──────────┬────────────────┬──────────┬─────────┐
│ 학번 │ 주민번호 │ 이름 │ 학과 │ 학년 │
├────────────┼──────────┼────────────────┼──────────┼─────────┤
│ 2023001 │ 990101-1 │ 홍길동 │ 컴퓨터공학 │ 1 │
│ 2023002 │ 000215-2 │ 김영희 │ 경영학 │ 1 │
│ 2022015 │ 010320-1 │ 이철수 │ 컴퓨터공학 │ 2 │
└────────────┴──────────┴────────────────┴──────────┴─────────┘슈퍼키 (Super Key)
유일성만 만족하는 키
슈퍼키 예시:
- {학번} ← 유일성 O
- {주민번호} ← 유일성 O
- {학번, 이름} ← 유일성 O (하지만 최소성 X)
- {학번, 주민번호, 이름, 학과} ← 유일성 O (하지만 최소성 X)
- {이름} ← 유일성 X (동명이인 가능)
- {학과} ← 유일성 X (같은 학과 학생 존재)후보키 (Candidate Key)
유일성 + 최소성 모두 만족하는 키
후보키 예시:
- {학번} ← 유일성 O, 최소성 O ✓
- {주민번호} ← 유일성 O, 최소성 O ✓
후보키가 아닌 것:
- {학번, 이름} ← 유일성 O, 최소성 X (학번만으로 충분)기본키 (Primary Key)
후보키 중에서 기본적으로 사용하도록 선택한 키
기본키 선택 기준:
1. NULL 값을 가질 수 있는 속성 포함 → 부적합
2. 값이 자주 변경되는 속성 포함 → 부적합
3. 단순한 후보키 선택 (자릿수 적은 정수, 짧은 문자열)
예시:
- 학번 vs 주민번호
→ 학번 선택 (더 짧고, 변경 가능성 낮음)대체키 (Alternate Key)
기본키로 선택되지 못한 후보키
기본키: {학번}
대체키: {주민번호}외래키 (Foreign Key)
다른 릴레이션의 기본키를 참조하는 속성
학생 릴레이션 학과 릴레이션
┌────────┬────────┬────────┐ ┌────────┬──────────┐
│ 학번 │ 이름 │ 학과코드 │ │ 학과코드 │ 학과명 │
├────────┼────────┼────────┤ ├────────┼──────────┤
│ 2023001│ 홍길동 │ CS │───────→│ CS │ 컴퓨터공학 │
│ 2023002│ 김영희 │ BA │───────→│ BA │ 경영학 │
└────────┴────────┴────────┘ └────────┴──────────┘
↑ ↑
외래키 기본키
(참조하는 릴레이션) (참조되는 릴레이션)키 종류 관계도
┌─────────────────────────────────────────────────────┐
│ 슈퍼키 │
│ (유일성 만족) │
│ ┌───────────────────────────────────────────┐ │
│ │ 후보키 │ │
│ │ (유일성 + 최소성 만족) │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ 기본키 │ │ 대체키 │ │ │
│ │ │ (선택됨) │ │ (선택 안됨) │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
외래키: 다른 릴레이션의 기본키를 참조하는 별도 개념4.2 자기 참조 외래키
외래키가 같은 릴레이션의 기본키를 참조할 수도 있다.
사원 릴레이션 (자기 참조)
┌──────────┬──────────┬──────────┐
│ 사원번호 │ 이름 │ 상사번호 │
├──────────┼──────────┼──────────┤
│ E001 │ 김사장 │ NULL │ ← 최상위 (상사 없음)
│ E002 │ 이부장 │ E001 │───┐
│ E003 │ 박과장 │ E002 │───┤ 상사번호는 사원번호를
│ E004 │ 최대리 │ E003 │───┘ 참조하는 외래키
└──────────┴──────────┴──────────┘
↑ │
└────────────────────┘
자기 참조5. 무결성 제약조건
무결성(Integrity)은 데이터에 결함이 없는 상태, 즉 데이터가 정확하고 유효하게 유지된 상태를 말한다.
무결성 vs 보안
| 구분 | 대상 | 목적 |
|---|---|---|
| 무결성 | 권한 있는 사용자 | 잘못된 요구로 데이터 부정확 방지 |
| 보안 | 권한 없는 사용자 | 무단 접근으로부터 데이터 보호 |
5.1 개체 무결성 제약조건 (Entity Integrity)
기본키를 구성하는 모든 속성은 NULL 값을 가질 수 없다.
올바른 릴레이션:
┌──────────┬──────────┬─────────┐
│ 고객번호 │ 이름 │ 등급 │
├──────────┼──────────┼─────────┤
│ C001 │ 홍길동 │ VIP │ ← 기본키(고객번호) NOT NULL
│ C002 │ 김철수 │ NULL │ ← 다른 속성은 NULL 가능
└──────────┴──────────┴─────────┘
위반 사례:
┌──────────┬──────────┬─────────┐
│ 고객번호 │ 이름 │ 등급 │
├──────────┼──────────┼─────────┤
│ NULL │ 홍길동 │ VIP │ ← 위반! 기본키가 NULL
│ C002 │ 김철수 │ Gold │
└──────────┴──────────┴─────────┘복합 기본키의 경우
주문상세(주문번호, 상품번호, 수량) -- 복합 기본키: (주문번호, 상품번호)
올바른 투플:
(O001, P001, 3) ← 둘 다 NOT NULL
위반 사례:
(O001, NULL, 3) ← 위반! 기본키의 일부가 NULL
(NULL, P001, 3) ← 위반! 기본키의 일부가 NULL5.2 참조 무결성 제약조건 (Referential Integrity)
외래키는 참조할 수 없는 값을 가질 수 없다.
외래키 값은 반드시:
- 참조되는 릴레이션의 기본키 값으로 존재하거나
- NULL이어야 한다
학과 릴레이션 (참조되는 릴레이션)
┌────────┬──────────┐
│ 학과코드 │ 학과명 │
├────────┼──────────┤
│ CS │ 컴퓨터공학 │
│ BA │ 경영학 │
│ EE │ 전자공학 │
└────────┴──────────┘
학생 릴레이션 (참조하는 릴레이션)
┌────────┬────────┬────────┐
│ 학번 │ 이름 │ 학과코드 │ ← 학과코드는 외래키
├────────┼────────┼────────┤
│ 2023001│ 홍길동 │ CS │ ← OK (CS 존재)
│ 2023002│ 김영희 │ BA │ ← OK (BA 존재)
│ 2023003│ 이철수 │ NULL │ ← OK (NULL 허용)
│ 2023004│ 박민수 │ CH │ ← 위반! (CH 존재하지 않음)
└────────┴────────┴────────┘5.3 참조 무결성 위반 시 대응
삭제 시 위반
학과 'CS'를 삭제하려고 할 때:
학생 릴레이션에 CS를 참조하는 투플이 있음
┌────────┬────────┬────────┐
│ 2023001│ 홍길동 │ CS │ ← CS 참조 중!
└────────┴────────┴────────┘
대응 방법:
1. RESTRICT: 삭제 거부 (기본값)
2. CASCADE: 참조하는 투플도 함께 삭제
3. SET NULL: 참조하는 외래키를 NULL로 변경
4. SET DEFAULT: 참조하는 외래키를 기본값으로 변경SQL에서의 정의
CREATE TABLE 학생 (
학번 VARCHAR(10) PRIMARY KEY,
이름 VARCHAR(50) NOT NULL,
학과코드 VARCHAR(10),
FOREIGN KEY (학과코드) REFERENCES 학과(학과코드)
ON DELETE SET NULL -- 삭제 시 NULL로 설정
ON UPDATE CASCADE -- 수정 시 함께 수정
);6. SQL로 보는 관계 데이터 모델
릴레이션 생성 (CREATE TABLE)
-- 학과 릴레이션 (참조되는 테이블)
CREATE TABLE 학과 (
학과코드 VARCHAR(10) PRIMARY KEY, -- 기본키
학과명 VARCHAR(50) NOT NULL,
위치 VARCHAR(100)
);
-- 학생 릴레이션 (참조하는 테이블)
CREATE TABLE 학생 (
학번 VARCHAR(10) PRIMARY KEY, -- 기본키 (개체 무결성)
주민번호 VARCHAR(14) UNIQUE, -- 대체키
이름 VARCHAR(50) NOT NULL,
학과코드 VARCHAR(10),
학년 INT CHECK (학년 BETWEEN 1 AND 4), -- 도메인 제약
FOREIGN KEY (학과코드) -- 외래키 (참조 무결성)
REFERENCES 학과(학과코드)
ON DELETE SET NULL
ON UPDATE CASCADE
);무결성 제약조건 확인
-- 개체 무결성 위반 시도 (실패)
INSERT INTO 학생 (학번, 이름) VALUES (NULL, '홍길동');
-- Error: Column '학번' cannot be null
-- 참조 무결성 위반 시도 (실패)
INSERT INTO 학생 (학번, 이름, 학과코드)
VALUES ('2023001', '홍길동', 'INVALID');
-- Error: Cannot add or update a child row:
-- foreign key constraint fails
-- 올바른 삽입
INSERT INTO 학과 VALUES ('CS', '컴퓨터공학', '공학관 301호');
INSERT INTO 학생 VALUES ('2023001', '990101-1234567', '홍길동', 'CS', 1);7. 정리
관계 데이터 모델 핵심 용어
| 용어 | 테이블 용어 | 파일 시스템 |
|---|---|---|
| 릴레이션 | 테이블 | 파일 |
| 투플 | 행(Row) | 레코드 |
| 속성 | 열(Column) | 필드 |
| 카디널리티 | 행 수 | 레코드 수 |
| 차수 | 열 수 | 필드 수 |
키 계층
슈퍼키 ⊃ 후보키 ⊃ { 기본키, 대체키 }
외래키: 다른 릴레이션의 기본키 참조무결성 제약조건
| 제약조건 | 대상 | 규칙 |
|---|---|---|
| 개체 무결성 | 기본키 | NULL 불가 |
| 참조 무결성 | 외래키 | 존재하는 값만 참조 가능 |
릴레이션 4가지 특성
- 투플의 유일성 - 중복 투플 없음
- 투플의 무순서 - 행 순서 무의미
- 속성의 무순서 - 열 순서 무의미
- 속성의 원자성 - 다중 값 불가 (1NF)