테이블 정규화는 데이터베이스 테이블 설계 과정에서 데이터의 중복성을 줄이고 무결성을 높이기 위한 과정입니다.
데이터의 중복을 최소화하여 저장 공간을 효율적으로 사용하고,
데이터를 수정, 추가, 삭제할 때 발생할 수 있는 문제를 방지합니다.
테이블 정규화는 데이터의 중복을 줄이고 무결성을 보장하기 위해 데이터베이스 테이블을 조직화하는 과정입니다. 정규화는 여러 "정규형" 단계로 구성되어 있으며, 각 단계마다 특정한 규칙이 적용됩니다.
다음은 각 정규형과 그에 따른 간단한 예제를 통한 설명입니다:
1NF (첫 번째 정규형)
규칙: 각 열(column)은 원자적인 값만 포함해야 합니다. 복합적인 값, 즉 여러 값이나 리스트, 집합 등이 들어가서는 안 된다는 의미,
각 행은 유일한 식별자를 가져야 합니다. 테이블 내에서 각 행을 구별할 수 있는 고유한 값이나 조합이 있어야 한다는 것을 의미
예제:
잘못된 설계:
| 학생ID | 이름 | 과목 |
|--------|-------|----------------|
| 1 | Alice | 수학, 영어 |
| 2 | Bob | 사회, 과학 |
1NF 적용 후:
| 학생ID | 이름 | 과목 |
|--------|-------|--------|
| 1 | Alice | 수학 |
| 1 | Alice | 영어 |
| 2 | Bob | 사회 |
| 2 | Bob | 과학 |
2NF (두 번째 정규형)
규칙: 테이블은 1NF를 만족하고, 부분적 함수 종속성이 없어야 합니다.
예제:
잘못된 설계:
| 학생ID | 과목 | 선생님 | 선생님 연락처 |
|--------|------|--------|-------------|
| 1 | 수학 | Mr.X | 12345 |
| 1 | 영어 | Ms.Y | 67890 |
여기서 (학생ID, 과목)이 복합 키입니다. 하지만 '선생님 연락처'는 '과목' 열에만 의존하고 있습니다. 즉, '선생님 연락처'는 복합 키 전체가 아닌 그 일부인 '과목'에만 종속적입니다. 이것이 부분적 함수 종속성의 예시입니다.
부분적 함수 종속성은 복합 키에서만 발생하는 문제입니다. 복합 키의 일부에만 종속된 열이 있을 때 이 문제가 발생합니다. 단일 열로 구성된 유일키의 경우, 다른 모든 열이 해당 유일키에 종속적이기 때문에 부분적 함수 종속성의 문제가 발생하지 않습니다.
2NF 적용 후:
학생과 과목 테이블:
| 학생ID | 과목 | 선생님 |
|--------|------|--------|
| 1 | 수학 | Mr.X |
| 1 | 영어 | Ms.Y |
선생님 테이블:
| 선생님 | 연락처 |
|--------|-------|
| Mr.X | 12345 |
| Ms.Y | 67890 |
3NF (세 번째 정규형)
규칙: 테이블은 2NF를 만족하고, 이행적 함수 종속성이 없어야 합니다.
예제:
잘못된 설계:
| 학생ID | 과목 | 성적 | 학점 기준 |
|--------|------|------|----------|
| 1 | 수학 | 95 | 90 |
| 1 | 영어 | 85 | 80 |
"학생ID"와 "과목"의 조합이 "성적"을 결정하면서, 간접적으로 "학점 기준"도 결정하게 됩니다. 이러한 상황에서 (학생ID, 과목 → 학점 기준) 의 관계가 이행적 함수 종속성을 가지게 됩니다. 왜냐하면 "학생ID"는 "학점 기준"에 직접적인 관계가 없지만, "과목"을 통해 간접적으로 "학점 기준"을 결정하게 되기 때문입니다.
"학생ID"가 "학점 기준"에 간접적으로 연결되어 있을 때 발생할 수 있는 주요 문제점
같은 과목을 듣는 여러 학생들에 대해 동일한 '학점 기준' 값이 반복적으로 저장됩니다. 이로 인해 불필요한 데이터 중복이 발생
만약 '수학' 과목의 '학점 기준'을 변경하고 싶다면, 해당 과목을 듣는 모든 학생의 레코드를 찾아 하나씩 수정해야 합니다
'학점 기준'을 변경하려고 할 때, 일부 레코드만 수정하고 나머지를 놓친다면 데이터베이스 내에 모순적인 정보가 존재하게 됩니다.
특정 과목을 듣는 마지막 학생의 정보를 삭제할 경우, 해당 과목의 '학점 기준' 정보도 함께 사라질 위험이 있습니다.
새로운 과목의 '학점 기준'을 추가하려면, 실제로 그 과목을 듣는 학생의 데이터가 없다면 이를 저장하기 어렵습니다.
3NF 적용 후:
학생 성적 테이블:
| 학생ID | 과목 | 성적 |
|--------|------|------|
| 1 | 수학 | 95 |
| 1 | 영어 | 85 |
과목 학점 테이블:
| 과목 | 학점 기준 |
|------|----------|
| 수학 | 90 |
| 영어 | 80 |
이외에도 BCNF, 4NF, 5NF 등 더 고급 정규형도 존재합니다. 하지만 대부분의 실제 데이터베이스 설계에서는 3NF나 BCNF까지의 정규화가 주로 사용됩니