회사에 DBA 가 있는곳은 더욱 계획적이고 최적화된 데이터베이스를 설계할 수 있다. 하지만 DBA가 없는 회사도 많고 사람들이 바껴가며 한 테이블에 컬럼만 계속해서 늘어나는 경우도 많다. 지금 내가 있는 회사도 한 테이블에 컬럼이 200개가 넘는 테이블이 있는데 .. 이미 만들어지고 데이터가 쌓인 테이블을 개선하는건 쉽지 않다. 그래서 데이터베이스를 설계하는게 아주 중요한데 거기에서 꼭 필수적인게 정규화이다.
정규화는 관계형 데이터베이스 설계에서 데이터의 중복을 줄이고, 데이터 무결성을 높이기 위한 과정이다. 정규화의 주요 목표는 데이터를 잘 구조화된 테이블에 나누어 데이터 중복을 최소화하고 데이터의 일관성을 유지하는 것이다. 정규화는 여러 단계로 나뉘며, 각 단계마다 데이터베이스 구조가 개선된다. 이러한 단계는 정규형(Normal Form)으로 불리며, 각 단계는 이전 단계의 제약을 강화한다.
정규화의 장점
1. 중복 데이터 감소: 데이터가 여러 테이블에 분리되어 저장되므로, 데이터 중복이 줄어든다.
2. 데이터 무결성 유지: 한 곳에서 데이터를 수정하면 그 변경이 모든 관련 데이터에 반영되므로 데이터 일관성을 유지할 수 있다.
3. 데이터 변경의 효율성: 데이터 구조가 간결해져 삽입, 삭제, 수정 작업이 더 간단해진다.
4. 저장 공간 절약: 중복된 데이터가 줄어들어 저장 공간을 절약할 수 있다.
정규화의 단계
1. 제1정규형(1NF: First Normal Form)
테이블의 각 열이 원자값(atomic value)을 가져야 하며, 중복된 레코드가 없어야 한다.
- 각 컬럼은 하나의 값만 가져야 한다 (즉, 배열이나 여러 값을 한 칸에 저장하면 안 됨).
- 테이블의 모든 레코드가 고유해야 한다.
2. 제2정규형(2NF: Second Normal Form)
제1정규형을 만족하면서, 부분 함수 종속(Partial Dependency)이 제거되어야 한다.
- 제1정규형을 만족해야 함.
- 기본 키의 일부에만 종속된 컬럼(부분 함수 종속)을 제거해야 한다.
- 기본 키가 복합 키(두 개 이상의 컬럼으로 구성된 키)일 경우, 기본 키의 일부만으로 결정될 수 있는 컬럼이 없어야 한다.
3. 제3정규형(3NF: Third Normal Form)
제2정규형을 만족하면서, 이행적 종속(Transitive Dependency)이 제거되어야 한다.
- 제2정규형을 만족해야 함.
- 기본 키가 아닌 다른 컬럼에 의존하는 컬럼(이행적 종속)이 없어야 한다.
4. BCNF (Boyce-Codd Normal Form)
제3정규형보다 더 엄격한 규칙으로, 후보 키(Candidate Key)가 아닌 컬럼에 의존하는 컬럼을 제거한다.
- 제3정규형을 만족해야 함.
- 테이블에 있는 모든 결정자(Determinant, 다른 컬럼을 결정하는 컬럼)는 후보 키여야 한다.
5. 제4정규형(4NF: Fourth Normal Form)
다치 종속(Multi-valued Dependency)을 제거하는 단계
- 한 테이블에서 하나의 키가 여러 개의 독립된 다치 종속을 가지면 안 된다.
6. 제5정규형(5NF: Fifth Normal Form)
조인 종속성(Join Dependency)을 제거하는 단계
- 테이블이 쪼개진 상태에서도 다시 조인될 때 원래의 정보가 온전하게 복원될 수 있도록 구성해야 한다.
정규화의 필요성
정규화는 데이터의 중복을 최소화하고, 삽입/삭제/수정 시 발생할 수 있는 이상(Anomaly)을 방지하는데 유리하다. 특히 데이터를 일관되게 유지하고 관리하는 데 효과적이며, 데이터베이스의 성능과 무결성을 개선한다.
정규화의 단점
- 복잡성 증가: 테이블이 지나치게 많이 나뉘면 쿼리가 복잡해지고, 성능 저하가 발생할 수 있다. 특히 많은 조인을 요구하는 경우 쿼리 성능이 떨어질 수 있다.
- 성능 저하: 매우 높은 수준의 정규화를 적용할 경우 성능이 희생될 수 있으며, 이는 대규모 시스템에서 문제가 될 수 있다.
따라서 정규화는 데이터 무결성과 성능 사이의 균형을 맞춰 적절히 적용하는 것이 중요하다. 단점을 보완하기위해 역정규화(반정규화)를 하기도 한다.
'잡학' 카테고리의 다른 글
ASCII 란? (0) | 2024.11.07 |
---|---|
ENCODING UTF-8 VS EUC-KR (1) | 2024.10.11 |
클러스터드 인덱스 (Clustered Index) VS 논 클러스터드 인덱스(Non-Clustered Index) (0) | 2024.09.11 |
클라이언트 사이드 렌더링 VS 서버 사이드 렌더링 (3) | 2024.09.03 |
2PC(2 Phase Commit) 에 대하여 (or 2 Transaction) (1) | 2024.08.15 |