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

SUNGKYUM KIM·2023년 3월 19일
0
post-thumbnail

정의와 개념

관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스

관계형 데이터베이스의 설계를 재구성하는 일종의 테크닉으로 데이터베이스를 삽입/갱신/삭제를 하며 나오는 여러 부작용(이상현상이라 부릅니다)을 해결 하기 위해 관계형 DB의 창시자인 에드거 F. 커드에 의해 등장한 개념입니다.

목표

여러가지 목표들이 있지만 크게 보면 다음과 같습니다.
1. 데이터베이스 변경에 있어서 이상현상을 제거
위에서 언급한 것처럼 데이터베이스에는 데이터의 변경이 필연적입니다. 충분히 정규화 되지 않은 테이블에서는 원치 않는 부작용이 발생할 수 있습니다. 이 부작용들은 대부분 중복되는 데이터들의 존재로 인해 발생하는데 정규화를 통해 이를 적절히 분리하는 것이 중요합니다.
갱신 이상 한 고용주의 중복되는 주소 레코드로 인해 그 모두를 바꿔주지 않음으로 인해 발생
삽입 이상
기존의 교수와 강의 테이블에 새로운 교수를 넣고자 하였으나 강의를 맡고 있지 않음으로 인해 삽입할 수 없는 현상이 발생
* 삭제 이상
수업을 중단하여 수업 정보를 삭제하고자 하였으나 교수 정보 전체가 모두 사라지는 현상이 발생
2. 데이터의 논리적인 저장
쉽게 말해 데이터 모델이 사용자에게 있어서 논리적이고 직관적이도록 만듭니다. 한 테이블이 너무 많은 정보를 담고 있다면 사용자는 테이블의 목적을 알 수 없을 뿐 아니라 실제 질의문(SQL)을 사용하는데에도 문제가 생깁니다. 테이블들간의 관계가 정규화를 통해 잘 정리된 테이블들은 현실세계와 같은 직관적인 테이블 해석이 가능해지며 질의문을 사용하기도 훨씬 간편하다는 장점이 있습니다.

예시

데이터베이스를 정규화 하기 위해서는 몇 가지 rule들이 있고 이 각각의 rule을 Normal Form(NF) 라고 부릅니다. 정규화는 각 단계에 따라서 제1정규형인 1NF부터 6NF까지 (BCNF를 포함한) 총 7단계가 있고 전 단계를 만족하지 못한다면 다음 단계로 넘어갈 수 없다는 특징이 있습니다.
예시로는 제3정규형까지 알아보도록 하겠습니다.

제1정규형

위 테이블은 유저의 주문정보를 저장하는 테이블입니다. 해당 테이블에서 만약 상품A가 포함된 주문번호를 찾고 싶다면 질의문이 매우 복잡할 것입니다. 뿐 아니라 주문상품을 수정하고 싶을 때에도 문제가 생길 수 있습니다.
따라서 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해 하는 것을 제1정규화라 부르며 만족하도록 테이블을 수정하면 아래와 같이 수정할 수 있습니다.

위와 같이 제1정규화를 마친 테이블을 제1정규형이라 부릅니다.

제2정규형

위의 테이블은 주문번호와 상품번호가 결합된 복합키로 이루어져 있습니다. 이 테이블은 제2정규형을 만족하지 않는데 이유는 주문번호만으로는 상품명과 단가를 결정할 수 없기 때문 인데 이러한 상황을 부분 함수 종속성이 존재 한다고 부릅니다. 주문상세테이블에서 주문번호가 변경되면 같은 주문번호에 속한 모든 상품명과 단가가 같이 변경될 가능성이 있습니다.

해당 테이블은 다음과 같이 주문상세 테이블과 상품테이블로 분리함으로 수정할 수 있습니다.

주문상세테이블

상품테이블

위와 같이 주문상세테이블에서 상품명과 단가를 분리하여 상품테이블에 저장함으로써 제2정규형을 만족합니다.

제3정규형

위의 테이블에서 주문번호, 고객명, 주소는 주문 정보와 관련이 있으며, 상품번호, 수량, 상품명, 가격은 상품 정보와 관련이 있습니다. 즉, 테이블 내에는 주문 정보와 상품 정보가 함께 존재하고있는 상황입니다. 이는 기본키 이외에 다른 컬럼이 그외 다른 컬럼을 결정지을 수 있는 상황이며 이 것을 이행적 함수 종속이 있다고 말합니다.
해당 테이블을 제3정규형을 만족하도록 수정하면 다음과 같습니다.

주문테이블

상품테이블

위와 같이 테이블을 분리함으로써 각 테이블은 하나의 주제에만 집중되어 제3정규형을 만족하게 됩니다.

이 외에도 3차 정규형을 조금 더 강화한 형태인 BCNF (Boyce and Codd Normal Form, 3차정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 정규형)와 4,5,6정규형이 있지만 실제로는 BCNF이상의 정규화를 많이 하지는 않습니다.

물론 정규화는 무조건 장점만이 있는 것은 아닙니다. 예를들어 제2정규형의 예시에서 만약 주문1의 총 가격을 알고 싶으면 주문상세테이블이나 상품테이블 하나로는 알 수 없고 언제나 Join을 사용하여야 합니다. 따라서 정규화를 진행할지 여부는 실제 프로그램에서 자주 사용하는 기능과 그 질의문으로 결정하는 것이 좋습니다.

Reference

profile
Code For Christ

0개의 댓글