데이터 중복을 최소화하고, 데이터 무결성을 확보하기 위해 테이블을 논리적으로 분해하는 과정.
관계형 데이터베이스 설계의 핵심 원칙
정규화를 통해 제거하려는 문제점
정규화의 단계별 규칙 (1NF, 2NF, 3NF, BCNF, 4NF, 5NF).
일반적으로 3NF 또는 BCNF까지 적용하는 것이 실무에서 주로 사용
중요 정규형
| 정규형 | 조건 | 목적 |
|---|---|---|
| 1NF | 모든 컬럼이 원자값 | 반복/다중 값 제거 |
| 2NF | 부분 함수 종속 제거 | 복합키 → 속성이 일부 키에 종속될 경우 분리 |
| 3NF | 이행적 종속 제거 | A→B, B→C 관계 제거 |
정규화된 데이터베이스의 성능 향상을 위해 의도적으로 데이터 중복을 허용하거나 테이블을 통합하는 과정.
과도한 정규화는 JOIN 연산을 증가시켜 성능 저하를 초래할 수 있어서 이를 해결하기 위해 사용된다.
데이터 조회(Read) 시의 성능 최적화. (JOIN 횟수 감소)
시스템의 쿼리(Query) 부하가 높거나, 조회 성능이 중요할 때.
📢정규화 = 데이터 무결성이 최우선.
반정규화 = 성능이 최우선.
데이터베이스의 상태를 변환시키는 하나의 논리적인 작업 단위.
여러 개의 SQL 명령어들을 묶어 하나의 작업으로 처리하며, 이 작업은 모두 성공하거나(Commit), 전부 실패하여 원래대로 돌아가야(Rollback) 한다.
트랜잭션이 안정적이고 신뢰성 있게 수행되기 위해 보장되어야 하는 네 가지 핵심 속성
| 속성 | 이름 (원문) | 설명 |
|---|---|---|
| A | Atomicity (원자성) | 트랜잭션 내의 모든 연산은 모두 성공하거나, 모두 실패해야 한다 (All or Nothing). |
| C | Consistency (일관성) | 트랜잭션 수행 전후에 데이터베이스가 미리 정의된 일관된 상태(제약 조건, 규칙)를 유지해야 한다. |
| I | Isolation (격리성) | 동시에 실행되는 트랜잭션들은 서로 독립적으로 수행되어, 마치 순차적으로 실행되는 것처럼 보여야 한다. |
| D | Durability (지속성) | 트랜잭션이 성공적으로 커밋(Commit)되면, 그 결과는 시스템 장애와 무관하게 영구적으로 보존되어야 한다. |
여러 트랜잭션이 동시에 실행될 때 데이터의 일관성(Consistency)과 동시 처리 성능(Concurrency) 사이의 균형을 맞추기 위해 트랜잭션 간의 격리 정도를 정의하는 기준
격리 수준이 높을수록 데이터 일관성은 높아지지만, 성능은 저하될 수 있다.
| 격리 수준 (낮음 → 높음) | 허용되는 현상 (문제점) | 주요 DBMS의 기본값 |
|---|---|---|
| Read Uncommitted (레벨 0) | Dirty Read | 거의 사용 안 함 |
| Read Committed (레벨 1) | Non-Repeatable Read | Oracle, PostgreSQL 기본 |
| Repeatable Read (레벨 2) | Phantom Read | MySQL(InnoDB) 기본 |
| Serializable (레벨 3) | 문제점 없음 (완전 격리) | 성능 저하로 잘 사용 안 함 |
여러 개의 트랜잭션이 동시에 데이터베이스에 접근하여 데이터를 조작할 때, 데이터 무결성(Integrity)과 일관성(Consistency)을 유지하도록 트랜잭션들의 상호 작용을 제어하는 메커니즘
주요 기법
MySQL InnoDB는 MVCC + REPETABLE READ 기본
대량 조회 서비스에서 JOIN 많으면 → 반정규화 적용 고려
금융/포인트/주문 시스템은 트랜잭션 정확도가 최우선 → 높은 고립 수준, 비관적 락
데이터베이스의 성능을 최적화하는 일련의 활동.
WHERE 절 최적화, 불필요한 JOIN 제거 등)둘 이상의 트랜잭션이 서로 상대방이 점유한 리소스의 해제를 기다리며 영원히 진행할 수 없는 상태에 빠지는 현상. 동시성 제어 시 발생하는 대표적인 문제.
여러 개의 분산된 데이터베이스에 걸쳐 하나의 논리적인 작업을 처리하는 트랜잭션. 모든 데이터베이스에서 작업이 성공해야 커밋되는 등 ACID 속성을 유지하기 위한 복잡한 메커니즘(예: 2PC, Two-Phase Commit)이 필요하다.
중요한 부분들이 강조되어 있어서 이해하기 좋았어요! 특히 표 내부에서 강조된 글씨가 있어서 한눈에 들어오네요!