콘텐츠로 바로가기

Relational Systems

데이터의 무결성과 일관성을 보장하는 관계형 모델, SQL 표준, 트랜잭션 보호 기법을 다루는 학습 노드입니다.

Article
M

Me

hyunyoun's Blog

data-information-managementdatainformation-managementrelational-systemsdatabasesrelationalsql-engineeringlearning9 min read

1. Overview

관계형 시스템(Relational Systems, RS)은 1970년대 에드가 코드(E. F. Codd)의 수학적 집합론과 관계 대수(Relational Algebra) 논문에서 출발하여, 반세기가 넘도록 현대 소프트웨어 엔지니어링의 핵심 기반(SSOT: Single Source of Truth)을 지탱해 온 데이터베이스 이론과 구현체를 다룹니다.

데이터는 무작정 텍스트 파일로 쌓아두면 중복이 발생하고 수정 과정에서 정합성이 깨질 수 있습니다. 학습자는 데이터를 2차원 표(Table)로 추상화하고, 기본키(PK)와 외래키(FK)로 연결해 일관된 도면을 짜는 정규화(Normalization)를 익힙니다. 나아가 SQL이라는 선언적 언어로 데이터를 다루는 논리적 과정과, 은행 송금 중 전원 코드가 뽑혀도 데이터의 원자성을 보장하는 ACID 속성, 락킹(Locking), MVCC(다중 버전 동시성 제어) 메커니즘을 훈련하여 신뢰할 수 있는 백엔드 스토리지 엔진을 설계하는 역량을 갖춥니다.

2. Scope & Boundaries

In-Scope

  • 관계형 모델 기초 (Relational Model): 튜플(Tuple), 어트리뷰트(Attribute), 도메인(Domain), 관계 대수(Selection, Projection, Join)의 수학적 근간.
  • 물리/논리 스키마 정규화 (Schema Design): 삽입/삭제/수정 이상(Anomaly), 함수적 종속성(Functional Dependency), 1NF부터 BCNF까지의 구조 분해(Decomposition).
  • SQL 표준 및 엔진 동작 (SQL Query Engine): DDL/DML/DCL/TCL, 옵티마이저(Optimizer)의 실행 계획(Execution Plan), 조인 알고리즘(Nested Loop, Hash, Merge Join).
  • 트랜잭션과 동시성 보호망 (Transaction Engine): ACID(원자성, 일관성, 격리성, 지속성) 보증 물리, 격리 수준(Isolation Levels), 데드락(Deadlock)과 락 에스컬레이션, MVCC 로깅과 롤백 메커니즘.

Out-of-Scope

  • 비관계형 분산 저장소 (NoSQL): 정해진 스키마가 없는 JSON Document나 Key-Value 스토어, Eventual Consistency 아키텍처 \rightarrow 06-02. NoSQL & Polyglot 영역으로 위임.
  • 분산 노드 간의 뗏목(Raft) 및 팍소스(Paxos) 합의 알고리즘: 단일 노드가 아닌 수천 대의 분산 서버 간 데이터 일치(Consensus) 논리 \rightarrow 07-02. Distributed Systems 영역으로 위임.
  • 디스크 블록 기록 및 페이지 플러시 물리: OS가 디스크 섹터에 0과 1을 쓰고 페이지 캐시를 다루는 로우 레벨 파일 시스템 \rightarrow 03. Operating Systems 영역으로 위임.

Boundaries

  • RS vs. Storage Systems (06-06): Storage Systems가 '디스크 드라이브가 어떻게 바이트를 기록하는가'라는 하드웨어 밀착형 물리라면, RS는 그 하드웨어 위에 구축된 **'테이블이라는 논리적 추상화와 SQL 엔진이 보장하는 트랜잭션의 수학적 무결성'**에 초점을 맞춥니다.

3. Counterexample

  • 과도한 조인과 N+1 쿼리 방치 (Query Fallacy): 애플리케이션 코드의 객체 지향 논리에만 기대어, 데이터베이스에 루프를 돌며 1,000번의 SELECT를 날리는 N+1 문제. RDBMS는 한 번의 SQL로 집합(Set) 연산을 수행할 때 좋은 성능을 냅니다. 옵티마이저가 수립한 해시 조인(Hash Join)이나 인덱스 스캔 실행 계획을 무시하고 애플리케이션 메모리로 데이터를 퍼 올려 조인하려는 시도는 RDBMS의 집합 연산 엔진을 낭비하는 안티패턴입니다.
  • 트랜잭션 격리 수준 이해 부족 (Isolation Fallacy): 트랜잭션 선언(@Transactional이나 BEGIN)만 해두면 모든 동시성 문제가 해결된다는 오해. 재고 차감 비즈니스 로직에서 두 스레드가 동시에 접근할 때, **Lost Update(갱신 손실)**나 Phantom Read(유령 읽기) 현상이 발생할 수 있음을 인지하지 못하고 격리 수준(Read Committed vs Serializable)의 물리적 오버헤드와 락(Lock) 경합(Deadlock)을 통제하지 못하는 것은 설계 결함입니다.

4. Prerequisites

  • 이산 구조 및 모델링 (Basic): RDBMS의 모든 근간이 집합론(Set Theory)의 교집합, 합집합 및 카테시안 곱(Cartesian Product)에서 파생되므로 수리 논리 기초가 필수입니다. (01-01. Discrete Structures)
  • 핵심 자료 구조 (Recommended): 인덱스가 어떻게 고속 탐색을 지원하는지 구조적으로 이해하려면 B-Tree 및 해시 테이블에 대한 선행 학습이 권장됩니다. (04-02. CDS)

5. Learning Map

Sequence Core Cluster Objective & Description Evidence (BoK)
1 Modeling Reality (ER & Normalization) 현실의 복잡한 데이터를 엔티티와 관계로 나누어 중복 없이 저장하는 제약 조건 설계를 익힙니다. P1/Relational
2 Querying Intelligence (SQL Engine) 선언적 질의어인 SQL이 내부적으로 어떤 인덱스와 조인 알고리즘을 타고 실행 계획을 수립하는지 살펴봅니다. P1/Relational
3 Guarding Integrity (ACID & MVCC) 수만 명의 동시 접속과 시스템 크래시 속에서도 데이터가 훼손되지 않는 트랜잭션 격리 메커니즘을 배웁니다. P1/Transactions
4 Optimization Logic (Tuning & Arch) B-Tree 인덱스 복합 키 설정과 쿼리 튜닝, 파티셔닝을 통해 DB의 응답 지연을 줄입니다. Industry

6. Learning Topics

Basic

Core Topic 01: 관계형 모델 기초와 정규화 물리 (Relational Model & Normalization)

  • Why to Learn: 엑셀 시트처럼 큰 1개의 테이블에 데이터를 몰아넣을 때 발생하는 중복(Redundancy)과, 데이터 갱신 시 일부만 수정되어 전체 정합성이 깨지는 이상 현상을 막기 위함입니다.
  • What to Learn:
    • Concepts: 릴레이션(Relation), 어트리뷰트(속성), 튜플(행), 도메인(값의 범위), 삽입/수정/삭제 이상(Anomaly), 함수적 종속성(Functional Dependency, XYX \rightarrow Y).
    • Skills: 기본키(PK)와 외래키(FK) 제약 조건 부여, 제1정규형(1NF, 원자값), 2NF(부분 함수 종속 제거), 3NF(이행적 함수 종속 제거), BCNF.
    • Tools: ERD(Entity-Relationship Diagram) 모델링 도구(Draw.io, ERwin).
    • Trade-offs: 정규화가 고도화될수록 데이터 무결성과 저장 용량 효율은 좋아지지만, 데이터를 읽을 때 수많은 테이블을 조인(Join)해야 하는 O(N)O(N)의 CPU/메모리 연산 오버헤드가 발생.
  • How to Learn:
    • 1단계: '학생명, 수강과목, 지도교수, 교수전화번호'가 한 테이블에 있는 비정규화 데이터를 그리고, 교수의 전화번호가 바뀔 때 100명의 학생 레코드를 모두 업데이트하다가 1건을 놓쳤을 때 발생하는 '갱신 이상(Modification Anomaly)'을 확인합니다.
    • 2단계: 위의 데이터를 식별자(PK)를 기준으로 '학생', '교수', '수강' 3개의 테이블로 나누고 외래키로 연결(3NF)한 뒤, 데이터 변경이 단 한 곳에서만 수행되는 구조를 스케치합니다.
  • Implement: 복잡한 주문/배송/상품 요구사항 텍스트 명세서를 입력받아, 정보의 종속성을 분석하고 BCNF까지 정규화된 SQL CREATE TABLE DDL(Data Definition Language) 스키마 파일로 출력.

Core Topic 02: 선언적 질의 엔진과 옵티마이저 (SQL Query Engine & Joins)

  • Why to Learn: "어떻게(How) 데이터를 찾을까"를 지시하는 C/Java와 달리, "무엇(What)을 원하는가"만 선언하는 SQL이 데이터베이스 내부에서 수억 건의 레코드를 어떤 알고리즘으로 스캔하는지 이해하기 위해서입니다.
  • What to Learn:
    • Concepts: 관계 대수(Selection, Projection, Join), 실행 계획(Execution Plan, 쿼리 트리), 서브쿼리(Subquery).
    • Skills: 조인 동작(Nested Loop Join의 O(N×M)O(N \times M) 비용, Sort-Merge Join, Hash Join), 인덱스 레인지 스캔(Index Range Scan) vs 테이블 풀 스캔(Full Table Scan) 분기점 판단.
    • Tools: EXPLAIN ANALYZE (MySQL/PostgreSQL), 힌트(Hint) 주입.
    • Trade-offs: 옵티마이저(Optimizer)의 통계 정보(Statistics)에 전적으로 의존하는 자동 실행 계획의 편리함 vs 데이터 분포도가 왜곡되었을 때 엉뚱한 인덱스를 타며 시스템 장애를 유발하는 블랙박스 리스크.
  • How to Learn:
    • 1단계: 10만 건의 Employees 테이블과 1천 건의 Departments 테이블을 조인할 때, 이중 for 문(Nested Loop)으로 1억 번 비교하는 방식과, 작은 테이블을 해시 맵에 올려 O(N)O(N) 만에 끝내는 Hash Join의 연산 비용 차이를 구조적으로 설명합니다.
    • 2단계: 옵티마이저가 쿼리 트리를 재작성하며 A(BC)A \bowtie (B \bowtie C)(AB)C(A \bowtie B) \bowtie C로 순서를 바꿔 메모리 점유율을 수십 배 낮추는 쿼리 변환(Query Transformation) 룰 기반 로직을 관측합니다.
  • Implement: 특정 조인 구문이 주어졌을 때 데이터베이스 옵티마이저처럼 동작하여, 테이블 사이즈 메타데이터를 기반으로 "이 조인은 Hash Join이 유리함"을 수학적으로 산출해 내는 미니 옵티마이저 시뮬레이터.

Practical

Core Topic 03: 트랜잭션, 락킹, 다중 버전 동시성 제어 (Transactions & MVCC)

  • Why to Learn: 1,000명의 유저가 동시에 한정판 티켓 1장을 예매하려 몰려드는 동시성 환경에서, 데이터베이스가 트랜잭션을 잃지 않고 단 1명에게만 정확히 할당하도록 보호선을 두기 위함입니다.
  • What to Learn:
    • Concepts: ACID(Atomicity 원자성, Consistency 일관성, Isolation 격리성, Durability 지속성), 커밋(Commit), 롤백(Rollback), Undo/Redo 로깅.
    • Skills: 공유 락(Shared Lock)과 배타 락(Exclusive Lock), 데드락(Deadlock) 순환 대기 교착 상태 탐지, 격리 수준(Read Uncommitted, Read Committed, Repeatable Read, Serializable).
    • Tools: PostgreSQL의 xmin/xmax 트랜잭션 메타데이터 분석, DB 모니터링 세션 락(Lock) 대기열 뷰.
    • Trade-offs: 데이터를 수정하는 스레드가 다른 모든 스레드의 접근을 락(Lock)으로 막는 강한 격리성(직렬화 가능 수준) vs 성능을 위해 잠금을 풀고 이전 데이터를 읽게 해 주지만 더티 리드(Dirty Read) 등 이상 현상을 감수하는 MVCC 타협.
  • How to Learn:
    • 1단계: 두 개의 트랜잭션 세션(A, B)을 열어 동일한 은행 계좌 잔액을 수정하려 시도하고, A가 커밋하기 전까지 B의 세션이 응답을 멈추고(Blocking) 블로킹 큐에서 대기하는 락 메커니즘을 디버거로 관찰합니다.
    • 2단계: A가 데이터를 수정하는 동안 B가 접근하면 락을 거는 대신 데이터베이스가 **언두 로그(Undo Log)**에 저장된 '수정 전의 옛날 버전(Snapshot)'을 B에게 반환하는 MVCC(다중 버전 동시성 제어) 기법의 비차단(Non-blocking) 읽기 물리를 다이어그램으로 설계합니다.
  • Implement: 두 개의 가상 스레드 트랜잭션이 서로의 자원을 교차 요구하여 데드락(A는 B의 락을, B는 A의 락을 대기)이 발생했을 때, 타임아웃(Timeout)을 감지하고 희생자(Victim)를 골라 강제 롤백(Rollback)시키는 트랜잭션 매니저 컴포넌트.

Advanced

Core Topic 04: 고급 인덱싱과 데이터베이스 물리 튜닝 (Indexing & Physical Tuning)

  • Why to Learn: 수십 테라바이트(TB), 수십억 건의 레코드가 적재된 프로덕션 서버에서, 밀리초 단위의 쿼리 응답 속도를 유지하는 고급 데이터베이스 관리자(DBA)의 튜닝 역량을 얻기 위해서입니다.
  • What to Learn:
    • Concepts: 클러스터형 인덱스(Clustered Index, 물리적 정렬 일치) vs 비클러스터형 인덱스(Non-clustered Index, 식별자 포인터 매핑).
    • Skills: 복합 인덱스(Composite Index)의 최적 선행 컬럼(Leading Column) 선택 규칙(카디널리티 분포), 커버링 인덱스(Covering Index) 튜닝, 파티셔닝(Partitioning - Range/Hash).
    • Tools: 슬로우 쿼리 로그(Slow Query Log), 인덱스 힌트(USE INDEX, FORCE INDEX).
    • Trade-offs: 테이블에 INSERT/UPDATE가 일어날 때마다 인덱스 B-Tree가 노드 분할(Page Split)을 일으키는 쓰기 오버헤드 vs 잘 설계된 인덱스가 읽기 성능을 1,000배 이상 높이는 리드 최적화.
  • How to Learn:
    • 1단계: (성별, 부서, 사번)으로 생성된 복합 인덱스에 대해 WHERE 부서 = 'A'라는 쿼리를 날리면 인덱스를 전혀 타지 못하고 풀 스캔하는 상황(B-Tree 정렬 순서 위반)을 B-Tree 그림을 통해 설명합니다.
    • 2단계: 쿼리에서 SELECT 이름, 나이 FROM user WHERE 사번 = 100을 날릴 때, 인덱스에 '이름, 나이'까지 포함된 복합 인덱스(커버링 인덱스)를 만들면 실제 데이터 블록(디스크 I/O)을 읽지 않고 메모리 상의 인덱스만으로 응답을 끝내는 튜닝을 체득합니다.
  • Implement: 특정 조건 검색이 잦은 가상의 대용량 테이블 스키마와 쿼리 로그 텍스트를 입력받아, 가장 높은 효율을 낼 수 있는 최적의 복합 인덱스 생성 DDL 코드를 추천하는 자동 튜닝 스크립트 작성.

7. Terminology

Term (EN / ko, abbr) 1문장 정의 단계(기본/권장/실무/심화) 역할/맥락 관련 개념 유사/대비/함께 사용 오해 포인트 Evidence(Primary/Secondary/Industry) Flags(core/misused/legacy)
Normalization (정규화) 데이터 중복을 최소화하기 위해 테이블을 구조적으로 분해하는 과정입니다. 기본 설계 가이드 3NF / BCNF Denormalization 단순히 '테이블 나누기'로 오해 P1:CS2023/Relational core
ACID 트랜잭션의 안정성을 보장하기 위한 원자성, 일관성, 격리성, 지속성의 약어입니다. 추천 정합성 보장 Transaction CAP Theorem 런타임 성능 지표로 오해 P1:CS2023/Transactions core
Index (인덱스) 데이터 검색 속도를 높이기 위해 별도로 관리되는 물리적 색인 구조(주로 B-Tree)입니다. 추천 성능 최적화 B-Tree Full Scan 많을수록 좋다고 오해 Industry SQL Tuning core
MVCC 동일 데이터에 대해 여러 버전을 유지하여 읽기와 쓰기가 서로를 방해하지 않게 하는 제어 방식입니다. 실무 동시성 관리 Snapshot Locking '단순 복제'와 혼동 Industry Internals core

8. References

Primary References

Secondary References

  • [Database System Concepts] Silberschatz, Korth, Sudarshan — The standard university text.
  • [Designing Data-Intensive Applications (DDIA)] Martin Kleppmann — Real-world systems view.

Industry References

  • [PostgreSQL Documentation - Internals Section] — Industrial MVCC implementation study.
  • [SQL Performance Explained] Markus Winand — Pragmatic indexing and tuning guide.

9. Final Checklist

Primary Checklist

  • 정규화되지 않은 테이블에서 데이터 삭제 시 관련 정보가 의도치 않게 사라지는 '삭제 이상'을 설명하고 방지할 수 있는가? (P1)
  • 특정 비즈니스 로직에 대해 원자성(Atomicity)이 깨질 경우 발생할 수 있는 손실 시나리오를 제시 가능한가? (P1)

Secondary Checklist

  • 인덱스가 검색 속도는 높이지만 삽입/수정 속도를 저하시키는 구조적 이유(Tree 균형 조정 등)를 이해하고 있는가?
  • '팬텀 리드(Phantom Read)' 현상이 발생하지 않는 격리 수준이 시스템 성능에 미치는 영향을 설명 가능한가?

Industry Checklist

  • 애플리케이션 로그에 찍힌 Slow Query를 분석하여 실행 계획 상의 병목 지점(예: 임시 테이블 생성)을 식별 가능한가? (SFIA)
  • RDBMS의 제약 조건(Not Null, Unique)이 애플리케이션 코드의 유효성 검사 대비 가지는 신뢰 우위를 인지하는가?

Data & Databases · Relational & SQL Engineering

3 / 4