[데이터베이스] 정규화 (1차, 2차, 3차, BCNF)

2022. 8. 13. 09:39CS/데이터베이스

  • 데이터베이스를 잘못 설계했을 때 불필요한 데이터 중복으로 인한 공간 낭비를 넘어 부작용을 초래할 수 있다.
  • 이러한 부작용을 이상(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