코딩 개발

DB 정규화

호소세 2023. 5. 3. 22:55
728x90
반응형

정규화

이상현상이 있는 관계를 분해하여 이상현상을 없애는 과정입니다. 이상현상이 존재하는 관계를 분해하여 여러개의 table을 생성합니다. 이를 단계별로 구분하여 정규형이 높아질수록 이상현상을 줄입니다.

 

정규화 장점

  • 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할 수 있습니다.
  • 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.
  • 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되어 응용프로그램의 생명을 연장시킨다.

정규화 단점

  • 릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아집니다.
  • 질의에 대한 응답 시간이 느려질 수도 있습니다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있습니다. 
  • 따라서 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있습니다.
  • 만약 조인이 많이 발생하여 성능 저하가 나타나면 반정규화(De-normalization)를 적용할 수도 있습니다.

 

 

제 1 정규형 (1NF)

규칙

1. 각 컬럼이 하나의 속성만을 가져야 한다.
2. 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
3. 각 컬럼이 유일한(unique) 이름을 가져야 한다.
4. 칼럼의 순서가 상관없어야 한다.
학생번호 이름 과목
101 유재석 파이썬, 자바
102 김종국 자바
103 이광수 C, 자바

한 칸에 하나의 정보만을 담아야하는데 2개의 정보를 담은 것이 2개 나 있습니다. 이상현상이기 때문에 다 따로 따로 칸에 넣어줘야합니다.

 

학생번호 이름 과목
101 유재석 파이썬
102 김종국 자바
103 이광수 자바
101 유재석 자바
103 이광수 자바

이렇게 말이죠. 이 모양이면 1형식의 1,2,3,4 규칙을 만족합니다.

 

제2 정규형(2NF)

규칙

1. 1정규형을 만족해야 한다.
2. 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 한다. == 모든 칼럼이 완전 함수 종속을 만족해야 한다.

부분적 종속, 완전 함수 종속.... 말이 너무나도 어렵습니다.

표 안에 2가지의 기본키가 있다면 그 기본키 2개에 대한 종속 값이 있는데 기본키 중에 한가지에만 종속되어있다면 그것을 부분 종속이라고 합니다.

 

예시를 볼까요.

학생번호 과목 지도교수 성적
101 파이썬 김교수 100
101 자바 박교수 90
102 C 최교수 80
103 C++ 강교수 70
103 DB 조교수 60

성적의 값은 학생번호와 과목의 종속 값이고, 지도교수는 과목의 종속 값입니다.

학생 + 과목 => 성적 (완전종속)
과목 => 지도교수 (부분종속)

따라서 표를 아래와 같이 만들어야합니다.

학생번호 과목 성적
101 파이썬 100
101 자바 90
102 C 80
103 C++ 70
103 DB 60
과목 지도교수
파이썬 김교수
자바 박교수
C 최교수
C++ 강교수
DB 조교수

 

제3 정규형(3NF)

규칙

1. 2 정규형을 만족해야 한다.
2. 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 한다.

이행 종속성... 이 뭘까요.

A -> B , B -> C 이면 A -> C 가 성립하면 이행 종속이라 한다고 합니다. 예시를 볼까요.

 

ID 등급 할인율
101 Vip 40%
102 Gold 20%
103 Silver 10%
104 Gold 20%

ID를 알면 등급을 알고

등급을 알면 할인율을 알고

고로, ID를 알면 할인율도 알기 때문에 표를 나눠야한다는 말입니다.

(ID -> 등급 , 등급 -> 할인율 , ID -> 할인율)

ID 등급
101 Vip
102 Gold
103 Silver
104 Gold
등급 할인율
Vip 40%
Gold 20%
Silver 10%

BCNF (Boyce-Codd Normal Form)

규칙

1. 3정규형을 만족해야 한다.
2. 모든 결정자가 후보키 집합에 속해야 한다.

이 내용은 바로 예시를 봐야 이해가 갑니다.

학생번호 과목 지도교수
101 자바 김교수
101 파이썬 박교수
102 자바 강교수
103 C 이교수
104 파이썬 홍교수

같은 과목이지만 지도교수가 다를 수 있는 경우를 볼 수 있습니다. 

학생 번호와, 과목으로 지도교수가 누구인지 알 수 있지만... 사실 지도교수만 알고 있으면 무슨 과목인지 알 수 있기 때문에 중복되는 값을 없앨 수 있습니다.

학생번호하고 지도교수 표와 지도교수와 과목 표 두개로 나누면 BCNF 규칙에 들어맞을 수 있습니다.

학생번호 지도교수
101 김교수
101 박교수
102 강교수
103 이교수
104 홍교수
지도교수 과목
김교수 자바
박교수 파이썬
강교수 자바
이교수 C
홍교수 파이썬

 

소감

제 3정규형 까지만 있는 줄 알았는데 BCNF에 4,5 까지 있더라고요. 4, 5 는 다음 시간에 알아보도록 합시다.

확실히 정규형을 잘 해놓으면 중복을 줄이기에는 매우 좋다고 생각이 듭니다. 어지러운 데이터보다는 깔끔한 데이터가 더 좋으니까요. 하지만 쿼리문이 어지러워진다는 문제점이 있지만, 또 어떻게 해결이 될겁니다. ㅎㅎ


출처

https://code-lab1.tistory.com/48

반응형