본문 바로가기

ComputerScience/Database

[Database]DB 정규화(normalization)개념과 정규화 과정(Normal form), 1NF ~ BCNF

데이터베이스 정규화와 Normal Form

  • 테이블 정규화는 중복 데이터와 데이터 업데이트 충돌을 최소화하기 위해, 일련의 normal forms(NF)에 따라 relational DB를 구성하는 과정
  • Normal Form(NF)이란 정규화 과정에서 준수해야 하는 규칙들이며, 처음부터 순차적으로 진행하며 normal form을 해당 규칙을 모두 만족할 때 1NF부터 BCNF까지 적용할 수 있다.
  • 1NF와 BCNF는 functional dependency와 key로만 정의될 수 있다.
  • 1NF부터 BCNF까지 를 만족하면 데이터베이스가 정규화됐다고 말하기도 하며, 일반적으로 실무에서는 3NF 혹은 BCNF까지만 진행하는 경우가 많다.
  • 5NF나 6NF 같은 경우에는 대부분의 경우 발생하지 않으며, 상당히 복잡하므로 많이 해도 4NF까지만 적용한다.

️Super Key, Candidate Key, Primary Key, Prime attribute

  • super key는 tuple들을 유니크하게 식별할 수 있는 attributes set
  • candidate key는 어느 한 attribute라도 제거하면 unique하게 tuples를 식별할 수 없는 super key
  • primary key는 테이블에서 tuple들을 유니크하게 식별하려고 선택된 candidate key
  • prime attribute는 임의의 Key에 속하는 attribute
  • non-prime attribute는 어떤 Key에도 속하지 않는 attribute

functional dependency

  • Functional dependency는 레프트 핸드 사이드 애트리뷰트에 따라 라이트 사이드 애트리뷰트가 한정되는 관계를 나타낸다.
  • 디펜던시를 통해 테이블의 튜플들을 유니크하게 식별할 수 있다.
  • functional dependency를 통해 두 attribute의 값이 동일하면 다른 attribute의 값도 동일하다.
  • 등급이란 애트리뷰트에 대한 functional dependency가 존재하여 각은행의 등급을 바로 알 수 있다.
  • 클래스가 같으면 뱅크 네임도 항상 같은 functional dependency가 존재한다.
  • 정규화를 통해 키마를 놓고 중복 데이터를 줄일 수 있는 방법을 보여준다.

Normalization

1NF

attribute의 value는 반드시 나눠질 수 없는 단일한 값이어야 한다.

위 테이블에서 수학, 영어와 같은 여러 데이터가 한 행에 존재한다. 이를 1NF는 분리된 행으로 수정한다.

 

2NF

모든 Non-prime attribute는 모든 key에 Fully functionally dependent 해야 한다.

위 테이블에서 학번과 과목이 Primary Key라고 하면 Non-Prime attribute는 성적과 과목코드이다.

여기서 성적은 학번과 과목에 fully functionally dependent 하다. 학번과 과목에 따라 성적이 달라지기 때문이다.

그런데 과목코드는 그렇지 않다. 오직 학번과 상관없이 과목에 대해서만 의존하므로, 2NF를 위반한다.

즉 {학번, 과목} -> {성적}은 fully functionally dependent하지만, {과목} -> {과목코드} 이므로 partially dependent하므로 2NF를 위반한다. 

따라서 다음과 같이 수정할 수 있다.

2NF는 key가 composite key가 아니라면 자동으로 만족한다?

모든 Non-prime attribute는 모든 key에 Fully functionally dependent 해야 한다.
모든 Non-prime attribute는 어떤 key에도 partially dependent 하면 안된다.

일부는 맞고 일부는 틀린 얘기이다. 

{empl_id} -> {empl_name, birth_date, company} 라는 함수 종속이 있다고 치고,

{} -> {company} (company가 전부 동일한 값을 가질때)를 동시에 만족한다고 치면 company는 empl_id에 partially dependent 하므로 2NF를 위반한다는 것이다.

 

3NF

모든 Non-prime attribute는 어떤 key에도 transitively dependent 하면 안된다.
즉 non-prime attribute와 non-prime attribute 사이에는 FD가 있으면 안된다는 것.

transitively dependent란, Y 또는 Z가 어떠한 key의 부분 집합이 아닐때 X -> Y && Y -> Z를 만족하면, X -> Z를 만족하는 함수 종속을 말한다.

Violating 3NF table

위 테이블에서 Purchase IDCustomer ID가 prime attribute이고, Album TitleArtist Name이 non-prime attribute라고 친다면, Album Title과 Artist Name은 Album Title의 값을 의존하므로, non-prime attribute와 non-prime attribute 사이에는 FD가 존재한다. 따라서 3NF를 위반하므로 아래와 같이 수정할 수 있다.

BCNF(Boyce-Codd 정규형)

BCNF(Boyce-Codd Normal Form)는 모든 Non-trivial FD(functional dependency) X -> Y는 X가 Super Key여야 한다는 룰이다.
쉽게 말해 Key가 아닌 Column이 다른 Key 집합 중, 일부를 의존하고 있는 것

Non-trival이란 X -> Y를 만족하는 FD(functional dependency)가 있을때 Y가 X의 부분 집합이 아닌 경우를 말한다.

위 테이블에서 Key는 Course IDDepartment Code이다. 그런데 Non-prime attribute인 Instructor Name이 Key 중 하나인 Department Code를 의존하고 있는 것. 즉 {Instructor Name} -> {Department Code}인데 Instructor Name이 Super Key가 아니므로 BCNF를 위반한다.

따라서 아래와 같이 수정할 수 있다.

 

DepartmentsInstructors테이블을 새로 생성하여, Instructor NameDepartment Code만 의존하도록 수정하였다.

Denormalization (역정규화)

  • 테이블을 너무 많이 나누면 성능과 관리 측면에서 문제가 생길 수 있다.
  • DeNormalization은 테이블을 다시 합치는 과정으로, 중복 데이터와 과도한 조인을 최소화하는 사이에서 적절한 수준을 찾는 것이 중요하다.

참고