2022. 8. 13. 09:39ㆍCS/데이터베이스
- 데이터베이스를 잘못 설계했을 때 불필요한 데이터 중복으로 인한 공간 낭비를 넘어 부작용을 초래할 수 있다.
- 이러한 부작용을 이상(Anomaly)라고 하는데, 이상 현상의 종류로 삽입이상, 갱신이상, 삭제이상이 있다.
- 정규화를 설명하기 앞서 이 이상현상에 대해 짚고 넘어가야 할 필요성이 있다.
※ 데이터베이스의 이상 현상(Anomaly)
- 삽입 이상(Insertion Anomaly) : 불필요한 정보를 함께 저장하지 않고서는 어떤 정보를 저장하는 것이 불가능하다.
- 갱신 이상(Modification Anomaly) : 반복된 데이터 중에 일부를 갱신할 시 데이터의 불일치가 발생한다.
- 삭제 이상(Deletion Anomaly) : 필요한 정보를 함께 삭제하지 않고서는 어떤 정보를 삭제하는 것이 불가능하다.
▷ 갱신 이상
- 어떤 값을 업데이트했을 때 그 속성의 다른 속성값들과의 불일치가 발생하는 현상
- 첫 번째 튜플의 이름 = 김사랑을 김소연으로 고치게 될 경우 3번째 튜플의 내용과 불일치가 발생한다.
- 따라서, 김사랑 값을 갖는 모든 튜플을 찾아 수정해주어야 한다.
▷ 삽입 이상
- 내가 원하는 값만 테이블에 삽입하고 싶은데, 테이플에 필요하지 않은 필드들 때문에 원치 않는 필드의 값도 삽입해야 하는 경우
- 1, 2, 3번 필드에 대한 값만 넣고 싶은데 테이블이 4개의 필드로 구성되어 있기 때문에 마지막 필드 값을 어떻게 해야 할지를 결정하지 못한다.
- 이렇듯 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제를 삽입이상이라고 한다.
▷ 삭제 이상
- 내가 원하는 값만 테이블에서 삭제하고 싶은데, 하나의 튜플이 삭제를 원치 않는 속성값도 포함하고 있기 때문에 같이 지워져서 생기는 문제이다.
- 튜플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제
- 이렇듯, 위와 같은 이상현상들이 발생하는 이유는 정규화가 되어있지 않은 테이블 설계 때문이다. 정규화를 통해 이상현상을 방지할 수 있다.
※ 데이터베이스 정규화
- 데이터베이스의 설계를 재구성하는 테크닉
- 불필요한 데이터(redundancy)를 없앨 수 있고, 삭제/갱신/삭제 시 발생할 수 있는 각종 이상현상들을 방지할 수 있다.
① 1차 정규화
- 1차 정규형은 각 로우마다 컬럼의 값이 1개씩만 있어야 한다. 이를 컬럼이 원자값(atomic value)을 갖는다고 한다.
- 위와 같은 예시에서, Adam의 Subject가 Biology, Maths로 두 개를 갖기 때문에 1차 정규형을 만족하지 못한다.
- 위와 같이 표현하려면 한 개의 로우를 더 만들게 되고 그만큼 데이터 redundancy는 증가한다. 데이터의 논리적 구성을 위해 이 부분을 희생하는 것으로 볼 수 있다.
② 2차 정규화
- 2차 정규형은 모든 컬럼이 완전 함수적 종속을 만족하는 것이다.
- 이는 다르게 말하면, 특정 컬럼에만 종속된 컬럼(부분적 종속)이 없어야 한다는 것이다.
- 위에서 들었던 예시의 경우 기본 키는 (Student, Subject)에 해당되고 이 두 필드값을 합쳐야 한 로우를 구분할 수 있다. 그런데 Age 컬럼의 경우 이 기본키 중에서 Student에만 종속적이다. 따라서 Age가 두 번 들어가는 것은 불필요한 것으로 생각할 수 있다.
- 이를 해결하기 위해 테이블을 쪼개야 한다. 그렇게 되었을 때 두 테이블 모두 2차 정규형을 만족하게 된다.
- 하지만, 이보다 조금 더 복잡한 테이블의 경우 갱신 이상을 겪기도 한다.
▷ 결정자, 종속자, 함수적 종속관계란?
- 판단을 하기위한 좀 더 수학적인 기법이 있다.
- 어떤 컬럼값(들)은 다른 컬럼 값을 고유하게 결정지을 수 있는데 이런 컬럼을 결정자라고 한다.
- 반대로 그 결정자에 의해 결정되어 지는 애는 종속자라고 한다.
- 그리고 그 종속자는 그 결정자의 종속관계에 있다고 한다.
- 정리하면 어떤 컬럼 A가 다른 컬럼 B의 결정자면 B는 A에 함수적으로 종속한다고 말한다.
그런데 성적은 {수강생번호,수강과목} 두 가지가 합쳐져야 결정이 된다.
이렇게 복합애트리뷰트(복합컬럼)에 의해 종속되고 그 외 어떤 것에도 부분적으로 종속되지 않은 관계를 완전 함수적 종속성이라고 한다.
그리고 복합 애트리뷰트가 아니라 빨간색 화살표처럼 부분부분 종속 관계가 있는걸 부분함수적 종속성이라 한다.
위 테이블은 결국 두 개의 덩어리의 부분함수적 종속성을 가지고 있는건데 완전 함수적 종속성 관계만 두고 나머지 부분함수적 종속성을 제거해주는게 제 2정규화이다.
애초에 완전함수적 종속성이 되려면 복합키여야 하기 때문에 1NF를 만족한 테이블 기본키가 단일키이면 2NF는 자동으로 성립한다.
제 2 정규화를 적용하면 위와 같다.
그래도 여전히 갱신,삭제,삽입 이상을 해결하지 못한다.
③ 3차 정규화
- 위와 같은 데이터 구성을 생각해보았을 때, Student_id가 기본키이고 기본키가 하나이므로 2차 정규형을 만족하는 것으로 볼 수 있다.
- 하지만 이 데이터의 Zip 컬럼을 알면 Street, City, State를 결정할 수 있고, 또한 여러 명의 학생들이 같은 Zip 컬럼값을 갖는 경우 Street, City, State, Zip에서 중복된 데이터가 생길 가능성이 있다.
- 3차 정규형은 기본키를 제외한 속성들 간의 이행적 함수 종속이 없는 것이다. 기본키 이외의 다른 컬럼이 그 외 다른 컬럼을 결정할 수 없다.
- 3차 정규화는 위와 같은 방법으로 테이블을 분리함으로써 해결할 수 있는데, 이를 통해 데이터가 논리적인 단위(학생, 주소)로 분리될 수 있고, 데이터의 redundancy도 줄었음을 알 수 있다.
④ BCNF (Boyce and Codd Normal Form)
- 3차 정규형으로 해결할 수 없는 이상현상을 해결할 수 있다.
- BCNF란 3차 정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 정규형이다.
학생 | 과목 | 교수 | 학점 |
1 | CS000 | X | A |
2 | CS123 | Y | A |
3 | CS123 | Y | A |
- 이 릴레이션에는 제약사항이 있다. 한 명의 교수는 한 강의만 담당할 수 있다는 점이다.
- 앞선 글에서 살펴보았듯, 후보키란 수퍼키 중 최소성을 만족하는 것이다. 위의 테이블에서 후보키에 해당되는 컬럼은 (학생, 과목)이다.
- 하지만, (교수)는 후보키가 아님에도 사전에 정의된 제약조건을 통해 과목을 결정짓고 있다. (후보키가 아닌 일반 컬럼인 교수가 과목의 결정자 역할을 하고 있음)
- 이 경우 이상 현상이 발생할 수 있다. 예를 들어, 교수 Y가 강의하는 과목명이 바뀌었다고 가정하면 두 개의 로우를 갱신해야 한다. (데이터 불일치가 일어날 가능성이 있음)
교수 | 과목 |
X | CS000 |
Y | CS123 |
학생 | 과목 | 학점 |
1 | CS000 | A |
2 | CS123 | A |
3 | CS123 | A |
- 위와 같이 테이블을 분리하는 것이 BCNF이다.
- 정리하자면, 3차 정규형을 만족하면서 BCNF를 만족하지 않는 경우는 일반 컬럼이 후보키를 결정하는 경우이다.
※ 비정규화 (반정규화, de-normalization)
- 정규화를 진행한 후, 필요에 의해 다시 릴레이션을 합치는 등 데이터를 중복시키는 작업이다.
- 데이터를 조회하는데 지나치게 조인이 많이 필요한 경우, 특정 데이터를 조회하는 프로세스의 수가 많고 특정 범위만을 조회할 경우 이 비정규화가 필요하다.
- 하지만 지나치게 비정규화를 하게 될 경우 데이터 무결성에 문제가 있을 수 있음
[출처]
데이터베이스 정규화 1NF, 2NF, 3NF, BCNF :: Deep Play (tistory.com)
데이터베이스 정규화 1NF, 2NF, 3NF, BCNF
데이터베이스 정규화 1NF, 2NF, 3NF, BCNF 데이터베이스 정규화란 데이터베이스의 설계를 재구성하는 테크닉입니다. 정규화를 통해 불필요한 데이터(redundancy)를 없앨 수 있고, 삽입/갱신/삭제 시 발
3months.tistory.com
'CS > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 트랜잭션 격리 수준 (0) | 2022.08.13 |
---|---|
[데이터베이스] 트랜잭션(Transaction)이란 (0) | 2022.08.13 |
[데이터베이스] 인덱스(Index) (0) | 2022.08.13 |
[데이터베이스] 데이터베이스 키(key)의 개념 및 종류 (0) | 2022.08.12 |
[데이터베이스] 커넥션 풀이란? (Connection Pool) (0) | 2022.08.12 |