데이터베이스 설계


데이터베이스 설계란?

데이터베이스 설계는 비즈니스 요구사항을 분석하여 효율적이고 일관된 데이터베이스 구조를 만드는 과정입니다. 올바른 설계는 성능, 확장성, 유지보수성을 결정하는 핵심 요소입니다.


데이터베이스 설계 단계

1. 요구사항 분석

  • 비즈니스 요구사항 파악
  • 데이터 요구사항 수집
  • 사용자 요구사항 분석
  • 성능 요구사항 정의

2. 개념적 설계

  • 엔티티 식별
  • 속성 정의
  • 관계 정의
  • ERD (Entity Relationship Diagram) 작성

3. 논리적 설계

  • 정규화 수행
  • 테이블 구조 정의
  • 관계 매핑
  • 제약 조건 정의

4. 물리적 설계

  • 데이터 타입 선택
  • 인덱스 설계
  • 파티셔닝 전략
  • 저장 공간 계획

5. 구현 및 검증

  • 스키마 생성
  • 데이터 마이그레이션
  • 성능 테스트
  • 최적화

ERD (Entity Relationship Diagram)

기본 요소

엔티티 (Entity)

  • 데이터베이스에 저장할 대상
  • 예: 사용자, 주문, 상품

속성 (Attribute)

  • 엔티티의 특성
  • 예: 사용자 이름, 이메일, 나이

관계 (Relationship)

  • 엔티티 간의 연결
  • 예: 사용자-주문 (1:N)

관계 타입

일대일 (1:1)

사용자 (1) ──── (1) 프로필

일대다 (1:N)

사용자 (1) ──── (N) 주문

다대다 (N:M)

학생 (N) ──── (M) 강의

정규화 (Normalization)

정규화의 목적

  • 데이터 중복 제거
  • 데이터 무결성 보장
  • 저장 공간 절약
  • 업데이트 이상 방지

정규화 단계

1NF (First Normal Form)

  • 각 컬럼은 원자값만 가짐
  • 중복 행 없음

비정규화 예시:

주문ID | 고객명 | 상품목록
-------|--------|----------
1      | 홍길동 | 노트북, 마우스, 키보드

1NF 적용:

주문ID | 고객명 | 상품명
-------|--------|--------
1      | 홍길동 | 노트북
1      | 홍길동 | 마우스
1      | 홍길동 | 키보드

2NF (Second Normal Form)

  • 1NF 만족
  • 부분 함수 종속 제거 (기본키의 일부에만 종속되는 속성 제거)

예시:

주문ID | 상품ID | 상품명 | 수량 | 가격
-------|--------|--------|------|-----
1      | P001   | 노트북 | 1    | 1000

2NF 적용:

주문상세 테이블:
주문ID | 상품ID | 수량
-------|--------|-----
1      | P001   | 1

상품 테이블:
상품ID | 상품명 | 가격
-------|--------|-----
P001   | 노트북 | 1000

3NF (Third Normal Form)

  • 2NF 만족
  • 이행 함수 종속 제거 (기본키가 아닌 속성에 종속되는 속성 제거)

예시:

사원ID | 사원명 | 부서ID | 부서명 | 부서위치
-------|--------|--------|--------|----------
E001   | 홍길동 | D001   | 개발팀 | 서울

3NF 적용:

사원 테이블:
사원ID | 사원명 | 부서ID
-------|--------|--------
E001   | 홍길동 | D001

부서 테이블:
부서ID | 부서명 | 부서위치
-------|--------|----------
D001   | 개발팀 | 서울

BCNF (Boyce-Codd Normal Form)

  • 3NF 만족
  • 모든 결정자가 후보키

4NF, 5NF

  • 다중값 종속 제거
  • 조인 종속 제거

반정규화 (Denormalization)

반정규화의 목적

  • 읽기 성능 향상
  • 복잡한 JOIN 제거
  • 쿼리 단순화

반정규화 전략

컬럼 중복

-- 주문 테이블에 고객명 추가
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    customer_name VARCHAR(100),  -- 중복
    order_date DATE
);

파생 컬럼

-- 주문 총액을 미리 계산하여 저장
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    total_amount DECIMAL(10,2),  -- 파생 컬럼
    order_date DATE
);

테이블 통합

-- 자주 함께 조회되는 테이블 통합
CREATE TABLE user_profile (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100),
    profile_data JSON  -- 프로필 정보 통합
);

반정규화 고려사항

  • 업데이트 비용 증가
  • 데이터 일관성 관리
  • 저장 공간 증가
  • 트레이드오프 분석

인덱스 설계

인덱스의 목적

  • 검색 성능 향상
  • 정렬 성능 향상
  • JOIN 성능 향상

인덱스 타입

단일 컬럼 인덱스

CREATE INDEX idx_email ON users(email);

복합 인덱스

CREATE INDEX idx_name_email ON users(username, email);

고유 인덱스

CREATE UNIQUE INDEX idx_unique_email ON users(email);

부분 인덱스

CREATE INDEX idx_active_users ON users(email) 
WHERE status = 'active';

인덱스 설계 원칙

  • 자주 조회되는 컬럼
  • WHERE 절에 자주 사용되는 컬럼
  • JOIN에 사용되는 컬럼
  • ORDER BY에 사용되는 컬럼
  • 외래키 컬럼

인덱스 주의사항

  • 인덱스는 저장 공간 사용
  • INSERT/UPDATE/DELETE 성능 저하
  • 너무 많은 인덱스는 오히려 성능 저하
  • 불필요한 인덱스 제거

데이터 타입 선택

숫자 타입

  • INT: 일반적인 정수
  • BIGINT: 큰 정수
  • DECIMAL: 정확한 소수점
  • FLOAT/DOUBLE: 근사치 소수점

문자열 타입

  • VARCHAR: 가변 길이 문자열
  • CHAR: 고정 길이 문자열
  • TEXT: 긴 텍스트

날짜/시간 타입

  • DATE: 날짜만
  • TIME: 시간만
  • DATETIME: 날짜와 시간
  • TIMESTAMP: 타임스탬프

기타 타입

  • BOOLEAN: 불린 값
  • JSON/JSONB: JSON 데이터
  • BLOB: 바이너리 데이터

관계 설계

외래키 (Foreign Key)

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

참조 무결성 옵션

FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE      -- 부모 삭제 시 자식도 삭제
ON UPDATE CASCADE      -- 부모 업데이트 시 자식도 업데이트
ON DELETE SET NULL     -- 부모 삭제 시 자식은 NULL
ON DELETE RESTRICT     -- 부모 삭제 방지

파티셔닝 (Partitioning)

파티셔닝의 목적

  • 대용량 테이블 관리
  • 쿼리 성능 향상
  • 유지보수 용이

파티셔닝 타입

범위 파티셔닝 (Range Partitioning)

CREATE TABLE orders (
    order_id INT,
    order_date DATE,
    total DECIMAL(10,2)
) PARTITION BY RANGE (YEAR(order_date)) (
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025)
);

리스트 파티셔닝 (List Partitioning)

CREATE TABLE users (
    user_id INT,
    region VARCHAR(50)
) PARTITION BY LIST (region) (
    PARTITION p_korea VALUES IN ('Seoul', 'Busan'),
    PARTITION p_usa VALUES IN ('NY', 'LA')
);

해시 파티셔닝 (Hash Partitioning)

CREATE TABLE products (
    product_id INT,
    name VARCHAR(100)
) PARTITION BY HASH (product_id) PARTITIONS 4;

데이터베이스 설계 모범 사례

1. 명확한 네이밍

  • 일관된 네이밍 컨벤션
  • 의미 있는 이름
  • 약어 사용 최소화

2. 적절한 정규화

  • 과도한 정규화 지양
  • 성능과 정규화 균형
  • 비즈니스 요구사항 고려

3. 인덱스 전략

  • 접근 패턴 분석
  • 적절한 인덱스 생성
  • 정기적인 인덱스 검토

4. 확장성 고려

  • 미래 요구사항 예측
  • 수평 확장 가능한 설계
  • 파티셔닝 전략 수립

5. 보안

  • 최소 권한 원칙
  • 민감 정보 암호화
  • 접근 제어 설계

6. 문서화

  • ERD 작성
  • 데이터 딕셔너리
  • 설계 의도 문서화

설계 도구

ERD 도구

  • MySQL Workbench: MySQL ERD 도구
  • pgAdmin: PostgreSQL 관리 도구
  • dbdiagram.io: 온라인 ERD 도구
  • Draw.io: 다이어그램 도구
  • Lucidchart: 클라우드 다이어그램 도구

데이터 모델링 도구

  • ERwin: 엔터프라이즈 데이터 모델링
  • PowerDesigner: 데이터베이스 설계 도구
  • Toad Data Modeler: 데이터베이스 모델링

설계 검증

정규화 검증

  • 정규화 단계 확인
  • 데이터 중복 확인
  • 함수 종속성 확인

성능 검증

  • 쿼리 성능 테스트
  • 인덱스 효과 확인
  • 부하 테스트

무결성 검증

  • 제약 조건 테스트
  • 외래키 검증
  • 데이터 검증

참고

  • 데이터베이스 설계는 애플리케이션의 기초입니다
  • 요구사항을 충분히 분석한 후 설계하세요
  • 정규화와 성능 사이의 균형을 고려하세요
  • 확장 가능한 설계를 고려하세요
  • 정기적인 설계 검토와 개선이 필요합니다