어흥
[CS] 데이터베이스 - 정규화 본문
1. 목적
- 불필요한 데이터 제거
- 논리적으로 데이터를 저장한다 -> 각종 이상현상을 방지
2. 정규화
- 1차 정규화(1NF) : 각 행마다 열에는 원자값(1개)을 가지고 있어야 한다
[적용 전]
이름 | 성적 |
일정규 | A,B |
이정규 | B,C |
[적용 후]
이름 | 성적 |
일정규 | A |
일정규 | B |
이정규 | B |
이정규 | C |
- 2차 정규화 (2NF) : 1차 정규화 + 모든 칼럼이 완전 함수 종속을 만족해야 한다 (부분 함수 종속 제거)
아래 예시의 테이블을 보면 [이름,강의]가 기본키를 이루며, 나이는 이름에만 종속적입니다. -> 테이블 2개로 분리
[적용 전]
이름 | 나이 | 강의 |
가가 | 20 | 데이터베이스 |
나나 | 22 | 데이터베이스 |
가가 | 20 | 선형 대수학 |
[적용 후]
이름 | 나이 |
가가 | 20 |
나나 | 22 |
이름 | 강의 |
가가 | 데이터베이스 |
나나 | 데이터베이스 |
가가 | 선형대수학 |
- 3차 정규화 (3NF) : 2차 정규화 + 이행적 함수 종속이 없다 -> 기본키 이외의 다른 컬럼이 그 외 다른 컬럼을 결정할 수 없다
기본키: 이름. 학교 칼럼에 의해 학교 위치, 학회장이 결정된다(일반이 다른 일반에 영향) -> 테이블 2개로 나눈다
[적용 전]
이름 | 나이 | 학교 | 학교 위치 | 학회장 |
나야 | 22 | 뉴욕대학교 | 뉴욕 | A |
너야 | 21 | 서울대학교 | 서울 | B |
[변경 후]
이름 | 나이 | 학교 |
나야 | 22 | 뉴욕대학교 |
너야 | 21 | 서울대학교 |
학교 | 학교 위치 | 학회장 |
뉴욕대학교 | 뉴욕 | A |
서울대학교 | 서울 | B |
- BCNF: 3차 정규화 (일반 칼럼이 다른 일반 칼럼에 영향을 주면 안된다)+ 모든 결정자가 후보키 집합에 속한 정규형 (일반 칼럼이 기본키에 영향을 주면 안된다)
-> 일반 칼럼이 어떠한 칼럼에도 영향을 주면 안된다(일반 칼럼이 결정자가 되면 안된다)
가정) 각 교수는 1개의 과목만 가르친다 -> 기본키가 될 수 있는 경우: (학생명,과목) or (학생명, 교수명) -> 테이블을 나눈다
학생과 과목을 일반키로 설정. 일반 칼럼인 교수명이 과목에 영향을 주기 때문에 테이블 분리
[적용 전]
학생명 | 과목 | 교수명 |
James | C++ | 씨플플 |
Yasmine | Java | 자바 |
Andrew | C++ | 씨플플 |
James | Pyhton | 파이썬 |
[적용 후]
학생명 | 과목 |
James | C++ |
Yasmine | Java |
Andrew | C++ |
James | Python |
과목 | 교수명 |
C++ | 씨플플 |
Java | 자바 |
Pyhton | 파이썬 |
3. 3NF <-> BCNF 차이
- 2개 모두 일반 칼럼이 주체(결정자)다
- 일반 칼럼이 다른 일반 칼럼에 영향을 준다 -> 3NF 위반, BCNF 위반 (BCNF의 기본 조건이 3NF만족이기 때문이다)
- 일반 칼럼이 기본키에 영향을 준다 -> 3NF 적용, BCNF 위반
- 일반 칼럼이 기본키와 일반 칼럼에 영향을 준다 -> 3NF위반, BCNF 위반
Ex) Table명: Number
칼럼명: 1,2,3,4,5
기본키: 1,2
기본 설정: 1,2가 3,4,5의 결정자 -> 3NF, BCNF 모두 만족
1) 3이 4,5의 결정자다(3이 4,5에 영향을 준다) -> 3NF,BCNF 둘다 위반
2) 3이 1의 결정자다(3이 1에 영향을 준다) -> 3NF 만족, BCNF 위반
3) 3이 1,4의 결정자다(3이 1,4에 영향을 준다) -> 3NF,BCNF 둘다 위반
참고 블로그
- yaboong.github.io/database/2018/03/10/database-normalization-2/
'CS > 데이터베이스' 카테고리의 다른 글
[DB] E-R Diagram (0) | 2021.09.15 |
---|---|
[CS] 데이터베이스 - 요약 (2) | 2021.09.02 |
[CS] 데이터베이스 - Index (0) | 2020.11.24 |
[CS] 데이터베이스 - DBMS (0) | 2020.11.20 |
[CS] 데이터베이스 - Transaction (0) | 2020.10.19 |