정규화
이상현상이 있는 관계를 분해하여 이상현상을 없애는 과정입니다. 이상현상이 존재하는 관계를 분해하여 여러개의 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 는 다음 시간에 알아보도록 합시다.
확실히 정규형을 잘 해놓으면 중복을 줄이기에는 매우 좋다고 생각이 듭니다. 어지러운 데이터보다는 깔끔한 데이터가 더 좋으니까요. 하지만 쿼리문이 어지러워진다는 문제점이 있지만, 또 어떻게 해결이 될겁니다. ㅎㅎ
출처
'코딩 개발' 카테고리의 다른 글
Apache Tomcat & Eclipse 설정하기 (Window, macOS 공용) (1) | 2023.05.13 |
---|---|
Apache Tomcat (WAS, Web Server, Apache HTTP Server, Apache Tomcat) (1) | 2023.05.13 |
Macbook 에서 AWS EC2 Window 원격 제어 (0) | 2023.05.02 |
Agile & Waterfall 개발 방식 (0) | 2023.04.02 |
다이나믹 프로그래밍 (2) | 2023.03.04 |