Database/Total

[SQLD] 제 1 정규형, 제 2 정규형, 제 3 정규형 차이 | 53회 기출 개념

키깡 2024. 5. 28.
728x90

오늘은 알아도 알아도 항상 까먹고 헷갈리는, 정규형을 잡고 가려한다.

제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정규형은 따져보니까 종속되는 게 따로 더 있을 때 (이행적종속일 때)

 

댓글