관계 데이터 모델

관계 데이터 모델

관계 데이터 모델 (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)   ← 위반! 기본키의 일부가 NULL

5.2 참조 무결성 제약조건 (Referential Integrity)

외래키는 참조할 수 없는 값을 가질 수 없다.

외래키 값은 반드시:

  1. 참조되는 릴레이션의 기본키 값으로 존재하거나
  2. 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가지 특성

  1. 투플의 유일성 - 중복 투플 없음
  2. 투플의 무순서 - 행 순서 무의미
  3. 속성의 무순서 - 열 순서 무의미
  4. 속성의 원자성 - 다중 값 불가 (1NF)