CS 박사되깅 8주차 데이터베이스 심화

윤현승·2025년 11월 9일

CS 스터디

목록 보기
8/9

정규화와 반정규화

정규화(Normalization)는 데이터베이스에서 데이터 중복을 줄이고 일관성을 높이기 위해, 테이블을 구조적으로 분리하는 과정입니다. 데이터 변경 시 무결성 보장, 저장 공간 절약, 유지보수가 쉽다는 장점이 있으나, 테이블이 많아지면 JOIN 연산이 빈번해져 조회 성능이 저하될 수 있습니다. 주로 OLTP, 금융 시스템같이 데이터 변경이 많은 곳에 적합합니다.

반면, 반정규화(Denormalization)는 성능 개선을 위해 정규화된 테이블을 다시 합치거나 중복을 허용하는 과정입니다. 조인 연산을 줄여 빠른 조회가 가능하고, 쿼리가 단순해집니다. 하지만 데이터 중복이 늘어나 관리 복잡성과 일관성 문제가 발생할 수 있어 데이터 변경이 적고, 조회가 많은 OLAP, 분석 시스템에서 주로 사용됩니다.

정규화의 단계별 설명

정규화는 보통 아래 단계로 이루어집니다. 각 단계는 데이터베이스의 이상 현상(중복, 삽입/삭제 오류 등)을 제거하는 데 목적이 있습니다:

  • 제1정규형(1NF): 모든 컬럼이 원자값(더 이상 쪼개질 수 없는 값)만 포함해야 한다. 즉, 한 셀에는 하나의 값만 들어가야 한다.
  • 제2정규형(2NF): 1NF를 만족하면서, 기본키의 일부만으로 식별할 수 있는 속성(부분 함수 종속성)이 없도록 분리한다. 즉, 기본키가 여러 컬럼(복합키)일 때, 모든 값이 전체 기본키에만 종속되도록 한다.
  • 제3정규형(3NF): 2NF를 만족하면서, 기본키가 아닌 다른 컬럼끼리의 종속성(이행적 종속)이 없도록 분리한다. 즉, 컬럼이 기본키에만 직접적으로 의존하도록 조정한다.
  • BCNF(Boyce-Codd 정규형): 3NF보다 더 엄격하게 후보키가 아닌 컬럼(결정자)에 대한 종속성도 제거한다. 복잡한 후보키 구조에서 모든 종속성을 후보키로 제한해 논리적 구조를 단순하게 한다.

정규화 단계가 올라갈수록 데이터 중복과 이상현상이 줄어들지만, 테이블 수가 증가해 성능상 부담이 될 수 있습니다.

JOIN 연산이란?

JOIN 연산은 여러 테이블에 분산된 데이터를 결합해 새로운 결과를 생성하는 SQL의 핵심 기능입니다. 대표적인 종류는 다음과 같습니다:

  • INNER JOIN: 두 테이블에서 공통된 키(컬럼) 기준으로 일치하는 행만 추출합니다.
  • LEFT/RIGHT OUTER JOIN: 한쪽 테이블의 모든 행과, 일치하는 행만 다른 테이블에서 결합합니다.
  • FULL OUTER JOIN: 양쪽 테이블의 모든 행을 결합하며, 일치하지 않는 부분은 NULL로 표시합니다.

출처 : https://www.devtodev.com/education/articles/en/414/sql-for-beginners-joins-and-funnels

정규화가 많아지면 여러 테이블을 자주 JOIN해야 하므로 읽기 성능이 저하될 수 있습니다. 조회성능이 중요한 시스템에선 반정규화로 JOIN 사용을 최소화하는 전략을 고려합니다.

DBMS의 동시성 제어: Lock과 MVCC

DBMS는 여러 트랜잭션이 동시에 같은 데이터를 접근할 때 "데이터 정합성"을 지키기 위해 동시성 제어 기능을 제공합니다:

Lock (락)

  • 행 락(Row Lock): 하나의 데이터 행에만 락을 건다. 동시 처리 효율이 높음.
  • 테이블 락(Table Lock): 테이블 전체에 락을 건다. 동시 처리가 제한됨, 간단한 구조에서 빠르게 사용.
  • 공유 락(Shared Lock): 읽기 작업을 위한 락으로, 여러 트랜잭션이 동시에 읽을 수 있음.
  • 베타 락(Exclusive Lock): 쓰기 작업을 위한 락으로, 하나의 트랜잭션만 데이터에 접근 가능.

MVCC (Multi-Version Concurrency Control)

  • 동시성을 위한 최신 방식. 데이터의 여러 "버전"을 저장하여 읽기 작업이 기존 데이터를 즉시 읽고, 쓰기 작업은 새로운 버전을 생성합니다.
  • 읽기 작업은 항상 커밋된 버전을 읽으므로 락 없이 동시성이 높아집니다. 대표적으로 MySQL의 InnoDB, PostgreSQL 등에서 사용됩니다.

각 방법은 데이터 크기, 트랜잭션 양, 시스템 특징에 따라 적절히 선택하며, 적합한 격리 수준과 함께 동시 동작 속도와 데이터 안전성을 균형 있게 맞추는 것이 중요합니다.


이렇게 정규화·반정규화, JOIN 연산, DBMS의 락/MVCC 등 다양한 데이터베이스 설계와 동시성 관리 방법을 함께 조합하여 시스템 요구에 최적화된 구조를 만드는 것이 핵심입니다.

profile
윤현승입니다!

5개의 댓글

comment-user-thumbnail
2025년 11월 10일

트랜잭션에 대한 설명이 자세히 추가되면 좋을 것 같아요!

답글 달기
comment-user-thumbnail
2025년 11월 10일

조인 연산은 아무 생각없이 보면 가끔 헷갈리는데 그림으로 표시되어 있으니까 좋네요!

답글 달기
comment-user-thumbnail
2025년 11월 10일

조인 연산을 사진과 함께 보니까 바로 이해가 되고 좋았습니다!

답글 달기
comment-user-thumbnail
2025년 11월 10일

이론적으로만 생각하고 있었는데 시각적으로 보이니까 확실히 이해하는게 훨씬 편하네요!

답글 달기
comment-user-thumbnail
2025년 11월 10일

데이터 정합성이 무엇인지 설명이 추가되면 더 좋을 것 같습니다!

답글 달기