ZeroBase/CS

데이터베이스 관계와 키(Key)

Red_Horse 2025. 9. 16. 08:02

관계의 표현 방식

관계 표현법:
- 1:1 (일대일) - 하나의 A는 하나의 B로 구성
- 1:N (일대다) - 하나의 A는 하나 이상의 B로 구성  
- 1:0..1 (일대영또는일) - 하나의 A는 하나 이하의 B로 구성
- 1:0..* (일대영이상) - 하나의 A는 0 또는 하나 이상의 B로 구성
 
 

1. 일대일 관계 (1:1)

하나의 A는 하나의 B로 구성되어 있다

-- 예시: 사용자와 사용자 프로필
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50) UNIQUE,
    email VARCHAR(100)
);

CREATE TABLE user_profiles (
    profile_id INT PRIMARY KEY,
    user_id INT UNIQUE,           -- 1:1 관계를 위한 유니크 제약
    bio TEXT,
    avatar_url VARCHAR(255),
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

-- 각 사용자는 정확히 하나의 프로필을 가짐
 
 

2. 일대다 관계 (1:N)

하나의 A는 하나 이상의 B로 구성되어 있다

-- 예시: 부서와 직원
CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(50)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(50),
    dept_id INT NOT NULL,          -- 필수 (하나 이상)
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

-- 각 부서는 최소 1명 이상의 직원을 가져야 함
 
 
 

3. 일대영또는일 관계 (1:0..1)

하나의 A는 하나 이하의 B로 구성되어 있다

-- 예시: 직원과 주차공간
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(50)
);

CREATE TABLE parking_spaces (
    space_id INT PRIMARY KEY,
    emp_id INT UNIQUE NULL,        -- NULL 허용 (0 또는 1)
    space_number VARCHAR(10),
    FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
);

-- 각 직원은 주차공간이 없거나 최대 1개만 가질 수 있음
 
 

4. 일대영이상 관계 (1:0..*)

하나의 A는 0 또는 하나 이상의 B로 구성되어 있다

-- 예시: 고객과 주문
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(50)
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT NULL,          -- NULL 허용 (0개 가능)
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

-- 각 고객은 주문이 없을 수도 있고, 여러 개를 가질 수도 있음
 
 
 

키(Key)의 계층 구조

 

키의 관계도

슈퍼키 (Superkey)
    │
    ├─ 후보키 (Candidate Key) ── 유일성 + 최소성
    │   │
    │   ├─ 기본키 (Primary Key) ── 선택된 후보키
    │   └─ 대체키 (Alternate Key) ── 선택되지 않은 후보키
    │
    └─ 비후보키 ── 최소성 위반
 
 

유일성과 최소성

  • 유일성: 중복되는 값이 없음
  • 최소성: 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있는 것

 

슈퍼키 (Super Key)

유일성이 있고, 그 안에 포함된 후보키는 최소성까지 갖춘 키입니다.

-- 학생 테이블 예시
CREATE TABLE students (
    student_id INT,      -- 고유 번호
    ssn VARCHAR(13),     -- 주민등록번호  
    email VARCHAR(100),  -- 이메일
    name VARCHAR(50),    -- 이름
    phone VARCHAR(15)    -- 전화번호
);

-- 슈퍼키 예시들:
-- {student_id}           ← 후보키 (최소성 O)
-- {ssn}                  ← 후보키 (최소성 O)  
-- {email}                ← 후보키 (최소성 O)
-- {student_id, name}     ← 슈퍼키 (최소성 X)
-- {ssn, email}           ← 슈퍼키 (최소성 X)
-- {student_id, ssn, email} ← 슈퍼키 (최소성 X)
 
 
 

기본키 (Primary Key)

유일성과 최소성을 만족하는 키이며, 테이블의 각 행을 고유하게 식별하는 필드입니다.

 

기본키의 규칙

  • 각 테이블에는 하나의 기본키만 있을 수 있음
  • NULL 값을 가질 수 없음
  • 중복 값을 가질 수 없음
  • 필드의 조합일 수도 있음
-- 단일 필드 기본키
CREATE TABLE users (
    user_id INT PRIMARY KEY,     -- 기본키
    username VARCHAR(50),
    email VARCHAR(100)
);

-- 복합 기본키
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)  -- 복합 기본키
);
 
 
 

자연키 (Natural Key)

이미 데이터에 존재하고, 실제로 의미가 있는 필드를 사용하여 테이블의 행을 고유하게 식별하는 키

-- 자연키 예시
CREATE TABLE countries (
    country_code CHAR(2) PRIMARY KEY,  -- ISO 국가코드 (자연키)
    country_name VARCHAR(50),
    continent VARCHAR(20)
);

INSERT INTO countries VALUES 
('KR', '대한민국', 'Asia'),
('US', '미국', 'North America'),
('JP', '일본', 'Asia');

-- 장점: 의미가 있고 직관적
-- 단점: 변경 가능성, 복잡한 조인
 
 
 

인조키 (Surrogate Key)

테이블의 행을 식별하기 위해 특별히 생성된, 일반적으로 숫자로 이루어진 고유 식별 키

-- 인조키 예시  
CREATE TABLE customers (
    customer_id INT AUTO_INCREMENT PRIMARY KEY,  -- 인조키
    customer_name VARCHAR(50),
    email VARCHAR(100),
    ssn VARCHAR(13)  -- 자연키가 될 수 있지만 기본키로 사용 안 함
);

-- 장점: 변경되지 않음, 성능 우수, 단순한 조인
-- 단점: 실질적 의미 없음, 추가 저장공간 필요
 
 
 

자연키 vs 인조키

특성 자연키 인조키
의미 실제 의미 있음 의미 없음
변경 가능성 변경 가능 변경 불가
성능 복잡할 수 있음 우수
저장공간 다양 효율적
조인 성능 느릴 수 있음 빠름

 

외래키 (Foreign Key)

다른 테이블의 기본키를 참조하는 필드입니다.

 

외래키의 규칙

  • 참조하는 기본키의 값과 일치해야 함
  • 중복될 수 있음 (여러 행이 같은 값 참조 가능)
  • NULL 값을 가질 수 있음 (선택적 관계)
-- 외래키 예시
CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(50)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(50),
    dept_id INT,                    -- 외래키
    manager_id INT,                 -- 자기 참조 외래키
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id),
    FOREIGN KEY (manager_id) REFERENCES employees(emp_id)
);

-- 외래키 제약 조건
-- 1. 참조 무결성: dept_id는 departments.dept_id에 존재하는 값이어야 함
-- 2. NULL 허용: dept_id가 NULL이면 부서 미배정 의미
-- 3. 중복 허용: 여러 직원이 같은 부서 소속 가능
 
 
 

후보키 (Candidate Key)

기본키가 될 수 있는 후보들이며 유일성과 최소성을 만족하는 것

 

대체키 (Alternate Key)

기본키로 선택되지 않은 후보키

-- 후보키와 대체키 예시
CREATE TABLE students (
    student_id INT PRIMARY KEY,        -- 기본키 (선택된 후보키)
    ssn VARCHAR(13) UNIQUE NOT NULL,   -- 대체키 (후보키였지만 선택 안됨)
    email VARCHAR(100) UNIQUE NOT NULL, -- 대체키 (후보키였지만 선택 안됨)
    student_number VARCHAR(10) UNIQUE NOT NULL, -- 대체키
    name VARCHAR(50),
    age INT
);

-- 후보키 목록:
-- 1. {student_id}     ← 기본키로 선택됨
-- 2. {ssn}           ← 대체키
-- 3. {email}         ← 대체키  
-- 4. {student_number} ← 대체키
 
 
 

복합키 (Composite Key)

두 개 이상의 필드를 조합하여 만든 키입니다. 각 필드 단독으로는 행을 고유하게 식별하지 못하지만, 조합할 경우 식별이 가능합니다.

-- 복합키 예시 1: 주문 상품 테이블
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    unit_price DECIMAL(10,2),
    PRIMARY KEY (order_id, product_id),  -- 복합 기본키
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

-- 의미: 같은 주문에서 같은 상품은 하나의 레코드만 존재
-- order_id=1, product_id=5 조합이 유일함

-- 복합키 예시 2: 학생 과목 수강 테이블
CREATE TABLE enrollments (
    student_id INT,
    course_id INT,
    semester VARCHAR(10),
    grade CHAR(2),
    PRIMARY KEY (student_id, course_id, semester),  -- 3개 필드 복합키
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

-- 의미: 특정 학생이 특정 학기에 특정 과목을 중복 수강할 수 없음
 
 
 

'ZeroBase > CS' 카테고리의 다른 글

데이터베이스 Join  (0) 2025.09.24
ERD(Entity Relation Diagram)  (3) 2025.09.21
ENUM과 SET  (0) 2025.09.16
힙(Heap)  (0) 2025.09.15
해시테이블(HashTable)  (0) 2025.09.13