정규화(Normalization)는 데이터 중복을 최소화하고 데이터베이스의 일관성을 유지하기 위해 테이블을 정교화하는 과정입니다. 이 과정은 데이터베이스에서 발생할 수 있는 삽입, 갱신, 삭제 이상(Insertion, Update, Deletion Anomalies)을 방지하는 데 중요한 역할을 합니다.
정규화 과정은 여러 단계로 나뉘며, 각 단계는 특정 규칙을 준수해야 합니다. 이러한 규칙을 정규형(Normal Form)이라고 부릅니다. 첫 번째 정규형부터 시작하여 차례대로 각 단계를 만족시키며 데이터베이스를 정규화합니다. 3NF(Third Normal Form)까지 정규화되면 해당 테이블은 자동으로 1NF, 2NF도 만족하게 됩니다.
실무에서는 일반적으로 3NF 또는 BCNF(Boyce-Codd Normal Form)까지 정규화를 진행하며, 필요에 따라 4NF까지 적용하기도 합니다.
정규화의 첫 번째 단계는 1NF(First Normal Form)입니다. 1NF는 모든 열의 값이 원자적(atomic)이어야 한다는 규칙을 요구합니다. 다음과 같은 예시 테이블을 살펴봅시다:
| 어카운트 ID | 은행 이름 | 계좌 번호 | 등급 | 월급 비율 | 임직원 ID | 임직원 이름 | 카드 ID |
|---|---|---|---|---|---|---|---|
| 1 | 국민은행 | 123-456 | 스타 | 0.7 | 101 | 소니 | 001, 002 |
| 2 | 우리은행 | 987-654 | 실버 | 0.3 | 101 | 소니 | 003 |
| 3 | 국민은행 | 654-321 | 로얄 | 1.0 | 102 | 메쉬 | 004, 005 |
위 테이블에서 카드 ID 열은 두 개의 값이 하나의 셀에 저장되어 있어 1NF를 위반합니다. 이를 해결하기 위해 카드 ID 값을 각각의 행으로 나눠 저장합니다. 이 작업을 통해 테이블은 1NF를 만족하게 됩니다.
| 어카운트 ID | 은행 이름 | 계좌 번호 | 등급 | 월급 비율 | 임직원 ID | 임직원 이름 | 카드 ID |
|---|---|---|---|---|---|---|---|
| 1 | 국민은행 | 123-456 | 스타 | 0.7 | 101 | 소니 | 001 |
| 1 | 국민은행 | 123-456 | 스타 | 0.7 | 101 | 소니 | 002 |
| 2 | 우리은행 | 987-654 | 실버 | 0.3 | 101 | 소니 | 003 |
| 3 | 국민은행 | 654-321 | 로얄 | 1.0 | 102 | 메쉬 | 004 |
| 3 | 국민은행 | 654-321 | 로얄 | 1.0 | 102 | 메쉬 | 005 |
위와 같이 카드 ID를 개별 행으로 분리하면 1NF를 만족할 수 있습니다.
2NF에서 주의할 점은 부분 함수 종속(Partial Functional Dependency)을 제거하는 것입니다. 테이블에서 하나의 속성이 기본 키의 일부에만 종속되는 경우, 부분 함수 종속이 발생할 수 있습니다. 이를 제거하기 위해 테이블을 분리합니다.
예를 들어, 위의 테이블에서 임직원 ID는 어카운트 ID에 따라 결정되며, 카드 ID는 어카운트 ID와 별도로 추가 테이블로 분리합니다.
임직원 테이블
| 어카운트 ID | 은행 이름 | 계좌 번호 | 등급 | 월급 비율 | 임직원 ID | 임직원 이름 |
|---|---|---|---|---|---|---|
| 1 | 국민은행 | 123-456 | 스타 | 0.7 | 101 | 소니 |
| 2 | 우리은행 | 987-654 | 실버 | 0.3 | 101 | 소니 |
| 3 | 국민은행 | 654-321 | 로얄 | 1.0 | 102 | 메쉬 |
카드 테이블
| 어카운트 ID | 카드 ID |
|---|---|
| 1 | 001 |
| 1 | 002 |
| 3 | 004 |
| 3 | 005 |
이와 같이 테이블을 분리하여 2NF를 만족할 수 있습니다.
이행적 종속은 A → B, B → C일 때 A → C인 관계를 의미합니다. 이 경우, B와 C 사이의 이행적 종속을 제거해야 합니다.
예를 들어, 등급과 은행 이름 사이의 이행적 종속이 존재하는 경우, 이들을 별도의 테이블로 분리합니다.
임직원 테이블
| 어카운트 ID | 계좌 번호 | 월급 비율 | 임직원 ID | 임직원 이름 |
|---|---|---|---|---|
| 1 | 123-456 | 0.7 | 101 | 소니 |
| 2 | 987-654 | 0.3 | 101 | 소니 |
| 3 | 654-321 | 1.0 | 102 | 메쉬 |
등급 테이블
| 등급 | 은행 이름 |
|---|---|
| 스타 | 국민은행 |
| 실버 | 우리은행 |
| 로얄 | 국민은행 |
이와 같이 등급과 은행 이름 사이의 이행적 종속을 제거하여 3NF를 만족할 수 있습니다.
정규화는 데이터베이스 설계에서 매우 중요한 과정입니다. 이를 통해 데이터의 중복을 최소화하고 데이터베이스의 일관성을 유지할 수 있습니다. 1NF에서 시작하여 3NF 또는 BCNF까지 정규화를 진행하면, 대부분의 경우 데이터베이스가 효율적이고 안정적인 구조를 가지게 됩니다.
https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe