본문 바로가기

Database/MySQL

데이터베이스 정규화(Normalization)

1. DB 정규화(Normalization)란?

  • 테이블 간에 중복된 데이터를 허용하지 않는다는 의미
  • 데이터의 무결성(Integrity)을 유지
    • 무결성이란 데이터의 일관성, 정확성을 유지하고 보증하는 것을 의미
  • 데이터의 중복배제와 확장성을 위해 테이블을 잘게 나누는 것을 의미한다.**

2. 정규화 단계

  • 테이블을 어떻게 재조정할지에 따라 정규화 단계가 나누어짐.
  • 각 단계는 이 전 단계의 내용을 포함한다.
  • 예를 들어, 제 2정규화 단계라면, 제 1정규화가 진행된 테이블을 가지고 제 2정규화를 진행한다.

 

3. 제 1정규화(1NF)

  • 원자성
  • 모든 속성은 반드시 하나의 값만 가져야 한다.

1) 제 1정규화 위배되는 경우

(1) 하나의 레코드가 다중 값을 가지는 경우

이름 sns
덱스터 인스타그램, 트위터
  • sns 칼럼에 인스타그램, 트위터 등 여러 속성이 저장되어 있는 경우

(2) 특정 속성이 반복 그룹을 가지는 경우

이름 sns1 sns2 sns3
덱스터 인스타그램 트위터 페이스북
  • sns1, sns2 등 같은 속성이 반복되는 경우

2) 제 1정규화 작업 후

  • 한 번에 하나의 속성만 가져야 한다.

account

id 이름 sns
1 덱스터 인스타그램
2 덱스터 트위터
3 덱스터 페이스북

 

4. 제 2정규화(2NF)

  • 부분 종속 제거
  • 모든 속성은 반드시 모든 기본키에 종속되어야 한다.
  • PK 일부에만 종속되어선 안된다.

1) 제 2정규화 위배되는 경우

order

id 주문번호 음료명 주문수량
1 20200102 아메리카노 2
2 20200103 아메리카노 3
3 20200104 콜드브루 2

(1) 이 테이블의 문제점

[1] 입력 이상

  • 주문이 발생하지 않다면 음료명 입력 불가능

[2] 수정 이상

  • 음료명이 변경될 경우 해당 레코드 update

[3] 삭제 이상

  • 음료 삭제 시 주문까지 삭제

 

2) 제 2정규화 작업 후

  • FK를 사용해 1대다 연관관계를 만들어 해결할 수 있다.
  • 즉, 음료는 pk에 종속되어야만 한다.**

order

id 주문번호 drink_id 주문수량
1 20200102 1 2
2 20200103 1 3
3 20200104 2 2

drink

id 음료
1 아메리카노
2 콜드브루
  • 이렇게 작업하면 주문과 관계없이 음료 CRUD를 진행할 수 있다.

5. 제 3정규화(3NF)

  • 이행 종속 제거
    • 이행 종속이란, A -> B, B -> C 일 때, A -> C가 성립되는 것을 의미.
  • 기본키가 아닌 모든 속성 간에는 서로 종속될 수 없다.
  • 즉, PK에만 종속되어야 한다.

1) 제 3정규화 위배되는 경우

shop

id 상점 과일 가격
1 참마트 바나나 3000
2 참마트 사과 4000
3 대마트 파인애플 5000
4 대마트 바나나 3000
  • 이행 종속 제거의 의미는 참마트 -> 바나나, 바나나 -> 3000라고 참마트 -> 3000이 성립된다는 의미는 아니라는 것이다.
  • 여기서 나타나는 문제점은 2정규화때 나타나는 문제점과 동일하다.

2) 제 3정규화 작업 후

  • FK를 사용해 1대다 연관관계를 만들어 해결할 수 있다.
  • 즉, 과일은 pk에 종속되어야만 한다.**

shop

id 상점 fruit_id
1 참마트 1
2 참마트 2
3 대마트 3
4 대마트 1

fruit

id 과일 가격
1 바나나 3000
2 사과 4000
3 파인애플 5000

 

reference

https://www.youtube.com/watch?v=pMcv0Zhh3J0