1. 정규화란?
데이터베이스 정규화(Normalization)는 테이블을 보다 체계적으로 조직하고 데이터의 중복을 최소화하여 데이터의 일관성을 유지하는 과정입니다. 이를 통해 데이터 삽입, 수정, 삭제 시 발생할 수 있는 이상현상(Anomalies)을 방지할 수 있습니다.
정규화를 수행하면 데이터 무결성이 강화되고 성능이 향상되지만, 조회 성능은 다수의 조인이 발생하여 저하될 수 있습니다. 이에 따라 필요한 경우 반정규화를 수행하여 조회 성능을 최적화합니다.
2. 데이터베이스 이상현상 (Anomalies)
정규화되지 않은 테이블을 사용할 경우 다음과 같은 이상현상이 발생할 수 있습니다.
2.1 삽입 이상 (Insertion Anomaly)
새로운 데이터를 삽입할 때 불필요한 정보를 함께 삽입해야 하는 현상.
2.2 갱신 이상 (Update Anomaly)
중복 저장된 데이터 중 일부만 갱신될 경우 데이터 불일치가 발생하는 현상.
2.3 삭제 이상 (Deletion Anomaly)
특정 데이터를 삭제할 때 의도하지 않은 다른 데이터까지 삭제되는 현상.
3. 정규화 단계
정규화는 단계적으로 진행되며, 각 단계에서 특정한 이상현상을 제거합니다.
3.1 제 1 정규형 (1NF: First Normal Form)
- 테이블의 속성이 모두 원자값(Atomic Value)만을 가져야 함.
- 중복 데이터를 제거하고 기본키를 설정해야 함.
- 동일한 속성이 반복되는 경우 별도의 테이블로 분리.
3.2 제 2 정규형 (2NF: Second Normal Form)
- 1NF를 만족한 상태에서, 부분 함수 종속성(Partial Dependency)을 제거해야 함.
- 즉, 기본키가 복합키(두 개 이상의 속성)일 때, 기본키의 일부만을 참조하는 속성을 별도의 테이블로 분리해야 함.
- 기본키가 단일 속성일 경우, 2NF는 자동으로 충족됨.
3.3 제 3 정규형 (3NF: Third Normal Form)
- 2NF를 만족한 상태에서, 이행 함수 종속성(Transitive Dependency)을 제거해야 함.
- 기본키를 제외한 컬럼 간의 종속성을 없애기 위해 별도의 테이블로 분리.
3.4 BCNF (Boyce-Codd Normal Form)
- 3NF를 만족하는 상태에서, 기본키가 아닌 후보키(Candidate Key)가 기본키를 종속시키는 경우 해당 후보키를 분리하여 테이블을 재구성함.
4. 반정규화 (Denormalization)
정규화를 수행하면 조회 성능이 저하될 수 있습니다. 이를 해결하기 위해 일부 테이블을 합치거나 중복을 허용하여 조회 성능을 최적화하는 과정이 반정규화입니다.
4.1 반정규화 적용이 필요한 경우
- 조인의 발생 빈도가 높아 조회 성능이 저하되는 경우.
- 데이터 처리 속도를 높이기 위해 구조를 단순화해야 하는 경우.
4.2 반정규화 기법
4.2.1 테이블 반정규화
- 테이블 병합: 조인이 자주 발생하는 테이블을 하나로 합침.
- 테이블 분할: 자주 조회되는 속성을 별도로 분리 (수직/수평 분할).
- 테이블 추가: 성능 향상을 위해 중복 테이블, 통계 테이블, 이력 테이블 추가.
4.2.2 컬럼 반정규화
- 중복 컬럼 추가: 자주 사용하는 데이터를 중복 저장하여 조인을 줄임.
- 파생 컬럼 추가: 연산이 필요한 값을 미리 계산하여 저장.
4.2.3 관계 반정규화
- 여러 관계를 거쳐야 하는 데이터를 단일 테이블로 유지하여 조회 성능 향상.
5. 트랜잭션 (Transaction)과 격리 수준
트랜잭션(Transaction)이란 데이터베이스에서 하나의 논리적 작업 단위입니다. 데이터 정합성을 유지하기 위해 트랜잭션 단위로 데이터를 처리해야 합니다.
5.1 트랜잭션의 ACID 특성
- 원자성 (Atomicity): 트랜잭션은 "All or Nothing" 원칙을 따라야 함.
- 일관성 (Consistency): 트랜잭션 실행 후 데이터 정합성이 유지되어야 함.
- 고립성 (Isolation): 트랜잭션은 독립적으로 실행되어야 함.
- 영속성 (Durability): 트랜잭션이 커밋되면 영구적으로 저장되어야 함.
5.2 트랜잭션 격리 수준과 문제점
트랜잭션 격리 수준(Isolation Level)이 낮으면 다음과 같은 문제가 발생할 수 있음.
- Dirty Read: 커밋되지 않은 데이터를 다른 트랜잭션이 읽음.
- Non-Repeatable Read: 같은 데이터를 두 번 조회할 때 값이 변경됨.
- Phantom Read: 같은 쿼리를 실행할 때 새로운 데이터가 추가됨.
6. Null 속성과 본질/인조 식별자
6.1 Null 속성
- Null은 "값이 없는 상태"를 의미하며, 공백 또는 0과는 다름.
- Null과 연산하면 결과는 항상 Null이 됨.
- 다중행 연산에서는 Null 값을 제외하고 연산.
6.2 본질 식별자 vs 인조 식별자
- 본질 식별자 (Natural Key): 업무에서 원래 존재하는 식별자.
- 인조 식별자 (Surrogate Key): 편의성을 위해 인위적으로 생성한 식별자.
- 본질 식별자는 의미가 명확하지만 복잡한 경우가 많아 인조 식별자를 활용하는 것이 개발 편의성을 높일 수 있음.
'ETC > SQLD' 카테고리의 다른 글
[SQLD] 1과목 - 데이터 모델링 (0) | 2025.02.28 |
---|