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 아키텍처 06-02. NoSQL & Polyglot 영역으로 위임.
- 분산 노드 간의 뗏목(Raft) 및 팍소스(Paxos) 합의 알고리즘: 단일 노드가 아닌 수천 대의 분산 서버 간 데이터 일치(Consensus) 논리 07-02. Distributed Systems 영역으로 위임.
- 디스크 블록 기록 및 페이지 플러시 물리: OS가 디스크 섹터에 0과 1을 쓰고 페이지 캐시를 다루는 로우 레벨 파일 시스템 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
6. Learning Topics
Basic
Core Topic 01: 관계형 모델 기초와 정규화 물리 (Relational Model & Normalization)
- Why to Learn: 엑셀 시트처럼 큰 1개의 테이블에 데이터를 몰아넣을 때 발생하는 중복(Redundancy)과, 데이터 갱신 시 일부만 수정되어 전체 정합성이 깨지는 이상 현상을 막기 위함입니다.
- What to Learn:
- Concepts: 릴레이션(Relation), 어트리뷰트(속성), 튜플(행), 도메인(값의 범위), 삽입/수정/삭제 이상(Anomaly), 함수적 종속성(Functional Dependency, ).
- Skills: 기본키(PK)와 외래키(FK) 제약 조건 부여, 제1정규형(1NF, 원자값), 2NF(부분 함수 종속 제거), 3NF(이행적 함수 종속 제거), BCNF.
- Tools: ERD(Entity-Relationship Diagram) 모델링 도구(Draw.io, ERwin).
- Trade-offs: 정규화가 고도화될수록 데이터 무결성과 저장 용량 효율은 좋아지지만, 데이터를 읽을 때 수많은 테이블을 조인(Join)해야 하는 의 CPU/메모리 연산 오버헤드가 발생.
- How to Learn:
- 1단계: '학생명, 수강과목, 지도교수, 교수전화번호'가 한 테이블에 있는 비정규화 데이터를 그리고, 교수의 전화번호가 바뀔 때 100명의 학생 레코드를 모두 업데이트하다가 1건을 놓쳤을 때 발생하는 '갱신 이상(Modification Anomaly)'을 확인합니다.
- 2단계: 위의 데이터를 식별자(PK)를 기준으로 '학생', '교수', '수강' 3개의 테이블로 나누고 외래키로 연결(3NF)한 뒤, 데이터 변경이 단 한 곳에서만 수행되는 구조를 스케치합니다.
- Implement: 복잡한 주문/배송/상품 요구사항 텍스트 명세서를 입력받아, 정보의 종속성을 분석하고 BCNF까지 정규화된 SQL
CREATE TABLEDDL(Data Definition Language) 스키마 파일로 출력.
Recommended
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의 비용, 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억 번 비교하는 방식과, 작은 테이블을 해시 맵에 올려 만에 끝내는 Hash Join의 연산 비용 차이를 구조적으로 설명합니다. - 2단계: 옵티마이저가 쿼리 트리를 재작성하며 를 로 순서를 바꿔 메모리 점유율을 수십 배 낮추는 쿼리 변환(Query Transformation) 룰 기반 로직을 관측합니다.
- 1단계: 10만 건의
- 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)을 읽지 않고 메모리 상의 인덱스만으로 응답을 끝내는 튜닝을 체득합니다.
- 1단계: (성별, 부서, 사번)으로 생성된 복합 인덱스에 대해
- Implement: 특정 조건 검색이 잦은 가상의 대용량 테이블 스키마와 쿼리 로그 텍스트를 입력받아, 가장 높은 효율을 낼 수 있는 최적의 복합 인덱스 생성 DDL 코드를 추천하는 자동 튜닝 스크립트 작성.
7. Terminology
8. References
Primary References
- [P1] CS2023 - DM/Relational Databases — Core database theory.
- [P2] SWEBOK - Software Construction — Database design and integration.
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)이 애플리케이션 코드의 유효성 검사 대비 가지는 신뢰 우위를 인지하는가?