정규화란?
1. 정규화(Normalization)란?
- 데이터 중복성 및 종속성 배체의 원칙을 공식화한 이론이다.
- 잘못 설계된 관계형 스키마를 더 작은 속성의 세트로 쪼개어 바람직한 스키마로 만들어 가는 과정이다.
- 정규형에는 제1정규형, 제2정규형, 제3정규형, BCNF형, 제4정규형, 제5정규형이 있으며, 차수가 높아질수록 만족시켜야 할 제약 조건이 늘어난다.
- 정규화는 데이터베이스의 논리적 설계 단계에서 수행한다.
- 정규화는 논리적 처리 및 품질에 큰 영향을 미친다.
즉, 정규화의 목표는 테이블 간에 중복된 데이타를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.
2. 비정규화 시 일어나는 문제, 이상(Anomaly)
2.1. 이상(Anomaly)의 개념
- 정규화를 거치지 않은 데이터베이스 내에 데이터들이 불필요하게 중복되어 릴레이션 조작 시 발생하는 예기치 않은 현상이다.
- 사용자의 의도와는 다르게 다른 데이터가 삽입, 삭제, 갱신되는 현상이다.
- 속성들 간에 존재하는 여러 종속 관계를 하나의 릴레이션에 표현하기 때문에 이상이 발생한다.
2.2. 이상의 종류
3. 정규화 단계
3.1. 제 1 정규화 (비정규형 -> 1NF)
학번 | 이름 | 메일 | 대학 | 전공 | 수강학기 | 과목명 | 성적 | 제한인원 |
101 | Tom | tom@naver.com | 이과대학 | 생물학과 | 2016.1 | 생물1 | A | 20 |
101 | Tom | tom@naver.com | 이과대학 | 생물학과 | 2016.1 | 생물2 | B | 30 |
102 | Dan | Dan@naver.com | IT대학 | 컴퓨터과 | 2016.2 | C++ | A | 40 |
102 | Dan | Dan@naver.com | IT대학 | 컴퓨터과 | 2017.1 | C언어 | C | 40 |
103 | Jin | jin@google.com | 정경대학 | 경제학과 | 2017.2 | 경제 | A | 30 |
그림1) 비정규형 테이블
제1 정규화란 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다.
원자값을 갖도록 하려면 아래와 같은 조건을 만족해야 한다.
1) 반복 그룹이 존재하면 안된다.
- Tom이라는 학생에 대한 정보인 이름,메일,대학,전공은 초기 설정하면 이후 계속 따라옴
- 그렇기 때문에 해당 정보는 수강 내역을 확인하기 위해서 계속 반복되기에 테이블을 분리해야 한다.
2) 모든 행은 식별자(Identifiers, 여러 개의 인스턴스를 담고 있는 엔터티에서 인스턴스를 구별하기 위한, 즉 엔터티를 대표하는 속성을 의미)로 완전하게 구분되어야 한다.
그렇다면 이 비정규형 테이블 예제를 1정규화 시켜 보도록 정리해 보도록 하겠습니다.
1. 반복되는 부분을 체크합니다. -> 학번, 이름, 메일 ,대학, 전공 (Prime key : 학번)
2. 반복되는 부분과 그렇지 않은 부분을 분리합니다. (단, prime key는 그대로 가져갑니다.)
3. 테이블을 나눈 후 반복되는 행은 삭제합니다.
이 과정을 거치면 아래와 같은 테이블로 변경
그런데, '학생' 테이블은 2번 조건인 "모든 행은 식별자로 완전하게 구분되어야 한다." 라는 조건이 만족하는 반면
수강내역은 prime key인 '학번'만으로는 모든 행이 구분되지 않는다.
그렇기 때문에 추가적으로 key를 설정해 주어야 한다.
그래서 '수강 내역' 테이블의 '학번'+'수강학기'+'과목명'을 복합하여 식별자로 두면서 문제를 해결하면 제 1 정규화는 마무리!
3.2 제 2 정규화 - 부분함수 종속 제거
3.3. 제 3정규화 - 이행적 함수 종속 제거
제 2정규형 조건을 만족하는 '학생' 테이블을 확인해보져
위에서 보게되면 non key 컬럼인 '대학'과 '전공'을 보게되면 key가 아닌 컬럼인데도 불구하고
종속 관계가 성립이 됩니다.
'대학'의 경우 '전공'을 포함하기 때문입니다.
즉, 생물학과면 무조건 이과대학에 포함되고, 컴퓨터 학과의 경우 IT대학의 부분으로 포함이 되지요.
정규화가 잘 된 테이블은 갑-을 관계만 있는 것 입니다.
그런데 '학생'테이블의 경우 갑(key:학번)-을(non-key:대학)-병(non-key : 전공) 관계가 있기 때문에 이 관계를 깔끔하게 정리 해주어야 합니다.
학번/이름/메일/전공 - 대학/전공으로 테이블이 나뉘게 됩니다.
'대학정보' 테이블의 경우 대학이 전공을 포함합니다. 하지만 key는 테이블의 튜플을 구분해 낼 수 있어야 합니다.
그래서튜플을 구분하기 위해서는 '전공'이 key 값이 되겠지요.
'대학' 정보를 참조하기 위해서는 학생 테이블의 '전공'을 외래키(foreign key)로 설정하여 '대학정보' 테이블을 참조 할 수 있게 해야 합니다.
그래서 제 3정규화를 마친 '학생' 테이블은 다음과 같이 분리 하게 됩니다.
* 결론!! 테이블 정리
그래서 비정규형 테이블이였던 '학생' 테이블을 제 3정규화까지 마치게 될 경우 아래와 같이 정리가 됩니다.
3.4. BCNF(Boyce-Codd Normal Form)
릴레이션 R에서 함수 종속성 X→Y가 성립할 때 모든 결정자 X가 후보키인 정규형이다.
기본키는 (학생번호, 특강이름)이고 교수는 (학생번호, 특강이름)에 완전하게 함수적으로 종속하고 있다. 또한, 교수도 특강 이름을 결정하며 결정자의 역할을 하고 있다. 다음으로, 모든 결정자가 후보키인지를 확인해야 한다. (학생번호, 특강이름)은 기본키이므로 당연히 결정자이며 후보키이다. 하지만 교수는 결정자이면서 후보키가 아니므로 위 그림과 같이 릴레이션을 분리해야 한다.
대부분의 릴레이션에서는 BCNF까지 정규화하면 실제적인 이상현상이 없어지기 때문에 BCNF까지 정규화를 진행한다.
4. 정규화의 장단점
- 장점
- 이상현상들이 발생하는 문제점을 해결할 수 있다.
- 정규화된 테이블들과 테이블들 간의 관계들을 사용자에게 제공할 수 있다.
- 단점
- 릴레이션 간의 연산(JOIN)이 많아진다.
- 이로 인해, 질의에 대한 응답시간이 느려질 수 있는 경우가 발생할 수도 있다.
참고 : https://mr-dan.tistory.com/10, https://jeongm1n.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%A0%95%EA%B7%9C%ED%99%94Normalization-%EC%9D%B4%EC%83%81%ED%98%84%EC%83%81-%ED%95%A8%EC%88%98%EC%A2%85%EC%86%8D%EC%84%B1-%EC%A0%95%EA%B7%9C%ED%99%94
'내일배움캠프' 카테고리의 다른 글
51일째(21.11.02) TIL (0) | 2021.11.03 |
---|---|
6주차 (21.10.18 ~ 21.10.24) WIL (0) | 2021.10.24 |
38일째(21.10.20) TIL (0) | 2021.10.20 |
32일째(21.10.14) TIL (0) | 2021.10.15 |
31일째(21.10.14) TIL (0) | 2021.10.14 |