티스토리 뷰
1. 정규화의 정의
- 릴레이션(테이블)간 잘못된 함수 종속 관계로 인해 DB이상현상이 일어나는 것을 해결하는 과정
- 저장공간을 효율적을 사용하기 위해 릴레이션을 여러개로 분리하는 과정
한마디로 릴레이션을 분해해서 여러개의 릴레이션으로 나누는 작업이라고 생각하면 된다.
2. 이상현상(anomaly)과 함수적 종속성
1) 이상현상
이상 현상은 잘못된 DB 설계로 인해 불필요한 중복이 발생해 릴레이션에 대한 삽입 , 수정, 삭제가 이뤄질 때 생기는 부작용을 말한다. 이상현상에는 삽입 이상, 갱신이상 , 삭제이상이 있다. 이 문제가 일어나는 이유는 서로 데이터를 공유하고 있지만 테이블들이 독립적으로 존재하고 있기 때문이다.
따라서 이상현상을 해결하기 위해서는 DB설계시 종속관계를 잘 따져가면서 설계를 해야한다. 즉, 정규화 과정을 진행해야 한다는 말이다. 아래의 표를 통해 이상현상에 대해서 알아보자.
학번 | 이름 | 강의명 | 강의코드 | 핸드폰 번호 |
1000 | A | 자료구조 | A-01 | 010 - 1234 - 7654 |
1001 | B | 데이터베이스 | A-02 | 010 - 4567 - 2341 |
1002 | C | 네트워크 | A-03 | 010 - 8930 - 1234 |
1002 | C | 운영체제 | A-04 | 010 - 1223 - 1204 |
1004 | D | NULL | NULL | 010 - 0120 - 2341 |
- 삽입 이상 : 튜플 삽입시 특정 속성에 삽입되는 값이 없어서 NULL값을 입력해야하는 상황
학번이 '1004'인 D 학생은 아직 수강신청한 강의가 없는데 삽입을 할 경우 강의명과 강의코드에 NULL값이 넣어지는 문제가 생긴다.
- 갱신 이상 : 튜플 수정시 중복 데이터의 일부만 수정되어 데이터 불일치가 일어나는 상황
학번이 '1002'인 학생이 핸드폰 번호를 변경해서 정보를 수정을 하면 '1002' 학생의 핸드폰 번호 정보가 변경되어야 하는데 3번쨰,4번째 튜플에 있는 학생은 동일 인물이지만 핸드폰 번호가 다르게 저장되는 문제가 생긴다.
- 삭제 이상 : 튜플 삭제시 같이 저장된 정보까지 같이 연쇄적으로 삭제되는 상황
자료구조 강의가 위 테이블에서 삭제된다고 할 때, 강의 정보만 삭제되는 것이 아니라 그 강의를 듣고있는 A 학생의 정보도 삭제되는 문제가 생긴다.
2) 함수적 종속성
함수적 종속성은 '어떤 릴레이션을 구성하는 속성의 부부집합이 X,Y라고 할때 하나의 X에 대해서 Y가 하나라면 X가 Y를 함수적으로 종속되어 있다.' 라는 관계를 말한다. 쉽게 표현하자면, A->B관계는 A는 B를 결정한다. 또는 B는 A에 종속한다 라고 말한다.
위 표를 예로 들면, 학번은 이름과 성적를 결정할 수 있다. 그렇다면 학번은 이름과 성적에 함수적 종속관계에 있다고 볼수 있다. 다르게 표현하면 학번 -> {이름, 성적}로 나타낼 수 있다.
함수적 종속관계는 완전함수 종속과 부분함수 종속 이 두가지로 분류할 수 있다. 완전 함수 종속 관계는 Y가 X에 완전히 종속된 관계를 말한다. 부분 함수 종속은 기본키 중 특정 컬럼에만 종속되는 것을 말한다.
위의 표를 다이어그램으로 나타내면 저 그림으로 나타낼 수 있는데 학생의 성적을 알기 위해서는 학번과 강의명을 알고있어야 하고 강의명을 통해 해당 강의의 지도 교수를 알 수 있다. 다이어그램을 토대로 {학번,강의명}은 성적과 완전 종속이 되어있지만 지도교수는 {학번, 강의명}중에서 {강의명}에 완전 종속되어 있다고 볼 수 있다.
3. 정규화의 종류
1) 제 1 정규형
제 1 정규형은 릴레이션의 모든 도메인이 더이상 분해될 수 없는 원자 값으로만 구성되어야하는 경우이다. 예를 들어서 아이디가 a라는 유저가 이벤트를 여러 번 참여했다고 가정했을 때 해당 유저의 이벤트 참여 경력을 아이디를 기준으로 한번에 묶을 수 있다. 하지만 이렇게 나타내는 것은 원자성을 해치기 때문에 각각의 다른 행으로 분리해 주어야 한다. 하지만 이상현상이 발생할수 있다는 단점이 있다.
2) 제 2 정규형
제 2 정규형은 릴레이션이 제 1 정규형을 만족하고 기본키가 아닌 모든 속성이 기본키에 완전 종속된 경우이다. 제일 위에 있는 표는 {학번,강의명}은 모여서 성적을 결정할 수 있지만 {지도교수}는 {강의명}으로만 결정할 수 있다. 지도교수는 강의명에 부분종속관계이다. 제 2 정규형은 완전종속관계로 이루어져 있기 떄문에 강의별 성적과 강의릴레이션을 분리하면 제 2 정규형이 된다.
3) 제 3 정규형
제 3 정규형은 제 2 정규형이고 기본키가 아닌 모든 속성이 '이행적 함수 종속관계' 를 만족하지 않는 상태를 말한다.
A -> B 이면 B ->C일 때, A -> C 가 성립될 때, C가 A에 이행적 함수 종속이 되었다고 할 수 있다.
학번으로 수강한 강의명을 찾아서 강의명을 참조해 성적을 찾을 수 있게 만들면 제 3 정규형이라고 말할 수 있다.
4) 보이스 / 코드 정규형 ,BCNF형
보이스 / 코드 정규형은 BCNF형이라고 말할 수 있다. BCNF형은 제 3 정규형을 만족하면서, 모든 결정자가 후보키인 상태를 말한다. 한마디로 후보키 집합에 없는 컬럼이 결정자가 되면 안된다는 말이다.
위의 테이블을 보면 기본키는 {학번, 강의명}이다. 기본키로 지도교수를 알 수 있다. 하지만 같은 강의를 다른 교수가 가르칠 수 있기 떄문에 강의명 -> 지도교수 사이의 종속은 성립되지 않는다. 하지만 지도교수가 어떤 강의를 가르치는지는 알 수 있기 떄문에 지도교수 -> 강의명 사이의 종속은 성립된다.
후보키가 아닌 지도교수가 결정자가 되는 상황인데 이는 BCNF를 만족하지 않는다라고 한다. BCNF를 만족하려면 테이블을 분리해주면 된다.
★ 정규화가 필요한 이유
정규화는 결론적으론 '테이블을 나누는 작업'이다. 테이블을 나누면서 성능이 좋아질 수 도 있지만 더 나빠질 수 도 있다. 테이블을 나누면 조인을 사용해야하는데 조인은 코스트가 큰 작업이다. 조인을 많이 사용할 수록 성능저하가 일어나기 떄문에 서비스에 따라서 정규화 또는 비정규화를 해주어야 한다.
정규화 작업은 중복데이터를 제거해주기 떄문에 스토리지에 대한 메모리 요구량이 줄어든다. 그래서 테이블이 정상적으로 작동하게 되고 오류도 감소한다. 하지만 조인이 많이 필요한 테이블은 비정규화를 해주어야 한다.
참고 자료
'CS전공지식 노트 > 5. DB' 카테고리의 다른 글
데이터 베이스 #6 : 데드락 (0) | 2023.08.02 |
---|---|
데이터베이스 #5 : 조인 (0) | 2023.08.02 |
데이터베이스 #4 : 인덱스 (0) | 2023.07.31 |
데이터베이스 #3 : RDBMS 와 NoSQL (0) | 2023.07.29 |
데이터베이스 #2 : 트랜잭션 (0) | 2023.07.29 |