오늘은 알아도 알아도 항상 까먹고 헷갈리는, 정규형을 잡고 가려한다.
제1정규형, 제2정규형, 제3정규형 그게 뭔데? 하고 매번 암기 후에 날려보낸다.
이번에는 글을 예시와 함께 작성하여, 그래도 조금이라도 오래 기억에 남게 저장해보려한다.
제 1 정규형
- 모든 필드가 원자값(더 이상 나눌 수 없는 값)을 가져야 한다.
- 각 필드는 한 가지 값만 가져야 한다.
반례
학생 테이블:
+-------+--------+----------------------+
| 학생ID (PK) | 이름 | 전화번호 |
+-------+--------+----------------------+
| 1 | 홍길동 | 010-1234-5678, 010-9876-5432 |
| 2 | 이몽룡 | 010-2345-6789 |
+-------+--------+----------------------+
여기서 '전화번호' 필드가 여러 개의 번호를 포함하고 있어 원자값의 조건을 만족하지 못한다.
만족하는 예시
학생 테이블:
+-------+--------+---------+
| 학생ID (PK) | 이름 | 전화번호 |
+-------+--------+---------+
| 1 | 홍길동 | 010-1234-5678 |
| 2 | 이몽룡 | 010-2345-6789 |
+-------+--------+---------+
여기서 '전화번호' 필드는 하나의 원자값만 가지고 있다.
제 2 정규형
- 제1정규형을 만족해야 한다.
- 기본 키(Primary Key)가 아닌 모든 필드가 기본 키에 완전히 종속되어야 한다.
- 즉, 기본 키의 일부분에만 종속되지 않아야 한다.
반례
학생 테이블:
+-------+--------+---------+-------------+
| 학생ID (PK) | 이름 | 과목ID (PK) | 과목명 |
+-------+--------+---------+-------------+
| 1 | 홍길동 | 101 | 수학 |
| 2 | 이몽룡 | 102 | 영어 |
+-------+--------+---------+-------------+
여기서 '과목명'은 '학생ID'에 종속되지 않고, '과목ID'에 종속된다.
좋은 예시
학생 테이블:
+-------+--------+---------+
| 학생ID (PK) | 이름 | 학과ID |
+-------+--------+---------+
| 1 | 홍길동 | 101 |
| 2 | 이몽룡 | 102 |
+-------+--------+---------+
학과 테이블:
+-------+---------+
| 학과ID (PK) | 학과명 |
+-------+---------+
| 101 | 컴퓨터공학과 |
| 102 | 전자공학과 |
+-------+---------+
학생 테이블에서 '이름'과 '학과ID'는 '학생ID'에 종속되어 있다. 또한 학과 테이블을 분리하여 각 학과의 정보가 독립적으로 저장되도록 했다.
제3정규형 (3NF)
- 제2정규형을 만족해야 한다.
- 기본 키에 종속되지 않은 필드들이 서로 종속 관계에 있지 않아야 한다.
- 즉, 기본 키가 아닌 필드 간에 이행적 종속이 없어야 한다.
반례
학생 테이블
+-------+--------+---------+-----------+
| 학생ID (PK) | 이름 | 학과ID | 학과명 |
+-------+--------+---------+-----------+
| 1 | 홍길동 | 101 | 컴퓨터공학과 |
| 2 | 이몽룡 | 102 | 전자공학과 |
+-------+--------+---------+-----------+
여기서 '학과명'은 '학과ID'에 종속되며, 이는 기본 키가 아닌 필드 간의 이행적 종속을 발생시킨다.
좋은 예시
학생 테이블:
+-------+--------+---------+
| 학생ID (PK) | 이름 | 학과ID |
+-------+--------+---------+
| 1 | 홍길동 | 101 |
| 2 | 이몽룡 | 102 |
+-------+--------+---------+
학과 테이블:
+-------+---------+-----------+
| 학과ID (PK) | 학과명 | 학과장 |
+-------+---------+-----------+
| 101 | 컴퓨터공학과 | 김철수 교수 |
| 102 | 전자공학과 | 박영희 교수 |
+-------+---------+-----------+
여기서 학과 테이블에 '학과장' 필드를 추가하여 학과와 관련된 정보가 한 테이블에 모여 있다. 이는 학과ID와 학과장이 이행적 종속 관계에 있지 않도록 하기 위함이다.
제 2 정규형은 만족하지만 제 3 정규형은 만족하지 않는 예시
+---------+-----------+-----------+-------------+------------+
| 학생ID (PK) | 학생이름 | 학과ID | 학과명 | 학과장 |
+---------+-----------+-----------+-------------+------------+
| 1 | 홍길동 | 101 | 컴퓨터공학과 | 김철수 교수 |
| 2 | 이몽룡 | 102 | 전자공학과 | 박영희 교수 |
+---------+-----------+-----------+-------------+------------+
각 비키 필드(학생이름, 학과명, 학과장)는 기본 키(학생ID)에 종속되어 있기 때문에 제 2정규형은 명백히 만족한다. 하지만 '학과장'은 기본 키가 아닌 '학과명'을 통해 종속된다.
정리하면, 제 1정규형은 한 필드에는 원자값만!
2정규형은 기본키 2개든 3개든 다른 비키 필드들은 그 모든 필드에 종속돼야돼! 하나에만 종속되면 안돼!
3정규형은 따져보니까 종속되는 게 따로 더 있을 때 (이행적종속일 때)
'Database > Total' 카테고리의 다른 글
[SQLD] 데이터 모델링의 세 가지 관점 | 53회 기출 개념 (0) | 2024.05.28 |
---|
댓글