어흥

[CS] 데이터베이스 - 정규화 본문

CS/데이터베이스

[CS] 데이터베이스 - 정규화

라이언납시오 2020. 9. 18. 15:43
728x90
반응형

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 둘다 위반

 

참고 블로그

- 3months.tistory.com/193

- yaboong.github.io/database/2018/03/10/database-normalization-2/

728x90
반응형

'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
Comments