반응형

들어가며

정규화?

  • 데이터의 불필요한 중복(redundancy)을 제거하기 위해 테이블을 나누는 과정
  • 삽입, 삭제, 수정시 발생할 수 있는 이상 현상(anamolies)을 방지할 수 있다.
  • 제1 정규화, 제2 정규화, 제3 정규화가 있다

정규화를 하는 이유?

  • 저장 공간 최소화
  • 효과적인 검색 및 관리
  • 데이터 무결성 유지
  • 데이터 구조의 일관성 유지

제1 정규화(1NF)

설명

  • 테이블에 있는 모든 속성의 도메인이 원자값(Atomic Value)만으로 되어있도록 정규화하는 것을 말한다

원자값으로 구성되지 않은 케이스1

  • 한 컬럼에 같은 타입의 데이터를 여러개 가지는 경우
seq  name  email                           
1    john  john@naver.com, john@gmail.com  
2    tom   tom@naver.com

원자값으로 구성되지 않은 케이스2

  • 한 테이블에 같은 타입의 컬럼을 여러개 가지는 경우
seq  name  email1          email2          
1    john  john@naver.com  john@gmail.com  
2    tom   tom@naver.com   -

원자값으로 구성한 케이스

seq  name  
1    john  
2    tom
seq  email           
1    john@naver.com  
1    john@gmail.com  
2    tom@naver.com

제2 정규화(2NF)

설명

  • 부분적 함수 종속을 제거하는 정규화 과정을 말한다
  • 기본키가 복합키인 경우 한 컬럼이 복합키 컬럼 중 하나에 종속하는 경우를 부분적 함수 종속이라 한다.
  • 단일키를 기본키로 사용하여 제2 정규화를 할 수 있다

부분적 함수 종속 케이스

  • 기본키는 model + comp인 복합키로 구성되어있다
  • os는 복합키의 부분인 model에 종속적이다.
  • os는 복합키의 부분인 comp에는 종속적이 아니다.
  • 이와 같은 케이스를 부분적 함수 종속 케이스라고 한다.
model    comp     os       
iPhone7  APPLE    iOS      
Galaxy7  SAMSUNG  Android

부분적 함수 종속을 제거한 케이스

  • 유일성을 만족하는 단일키를 기본키로 추가하여 부분적 함수 종속을 제거할 수 있다
  • 의미 없는 키를 synthetic key라고 한다. (ex. auto_increment 시퀀스값)
  • 의미 있는 키를 natural key라고 한다. (ex. 주민등록번호)
seq  model    comp     os       
1    iPhone7  APPLE    iOS      
2    Galaxy7  SAMSUNG  Android

제3 정규화(3NF)

설명

  • 이행적 함수 종속을 제거하는 정규화 과정이다.
  • 이행적 함수 종속은 한 컬럼이 다른 컬럼에 종속적이고 해당 컬럼도 다른 컬럼에 종속되는 경우를 말한다.

이행적 함수 종속 케이스

  • name, address, schoolName, schoolAddress 모두 id에 종속된다
  • schoolAddress는 schoolName에 종속된다
id  name  address  schoolName    schoolAddress  
1   john  NewYork  NewYork Univ  NewYork Univ

이행적 함수 종속을 제거한 케이스

id  name  address  schoolId  
1   john  NewYork  1         
schoolId  schoolName    schoolAddress  
1         NewYork Univ  NewYork Univ
반응형

'Development > MySQL' 카테고리의 다른 글

[MySQL] Storage Engine  (0) 2020.12.29
[MySQL] Transaction Isolation Level  (0) 2020.12.29
[MySQL] 쿼리  (0) 2020.12.29
[MySQL] 설치하기  (0) 2019.09.29
[Database] 옵티마이저  (0) 2018.07.15

+ Recent posts