DB 정규화 1NF, 2NF, 3NF, BCNF

Jay Jang·2022년 8월 7일
0

DB

목록 보기
4/4


https://bitnine.net/relational-database/data-modeling-rdb/


정규화 Normalization


정규화 Normalization의 목표는 테이블 간에 중복된 데이터(redundancy)를 허용하지 않게 구조화하는 데 있다.

정규화의 목적은 하나의 테이블에서 데이터의 삽입, 삭제, 변경이 정의된 관계들로 인하여 데이터베이스의 나머지 부분들로 전파되게 하는 것이다.

정규화된 데이터는 논리적으로 저장되어, 어떠한 relation 관계라도 데이터베이스 내에서 표현 가능하다.

1970년 에드거 F.커드에 의해 정의된 제1 정규화(1NF)부터 2002년 크리스토퍼 J.데이트, 허그 다위, 니코스 로렌츠에 의해 소개된 제6 정규화(6NF)까지 발전된 정규화 모델이 있다.

이 중 1NF, 2NF, 3NF 그리고 3NF를 발전시킨 BCNF(boyce and codd normal form)까지가 standard로 여겨지고 있다.

지금부터 1NF부터 2NF, 3NF, 그리고 BCNF를 이야기해보자.


1NF 제 1 정규화


제1 정규화란 테이블의 컬럼이 원자값(Atomic Value)을 가지도록 테이블을 분해하는 것이다.
조금 더 쉽게 설명하자면, 테이블 데이터의 row에서 하나의 column에 있어서 한 가지 값만 저장되어야 한다는 것이다.

데이터가 다음과 같이 저장되어 있다.

Employee를 기본 키로 하여 나머지 column 값들은 이에 종속됨을 볼 수 있다.
Employee를 Melvin으로 가지는 row의 Department column 값을 보면 Marketing, Sales 두 개의 값이 저장된 것을 볼 수 있다.

이는 1NF를 만족하지 못하는 데이터 모델링이며, 두 개의 row로 쪼개어 1NF를 만족시킬 수 있다.


2NF 제2 정규화


제2 정규화부터가 본격적인 데이터베이스 정규화라고 할 수 있다.

제2 정규화란 제1 정규형을 만족한 테이블에 대해서 완전 함수 종속을 만족하도록 테이블을 분리하는 것이다.

더 쉽게 설명하자면, 기본 키 중 일부 키에만 종속되는 값이 없어야 한다는 것이다. 부분종속이 없어야 한다.

다음과 같이 학번, 이름, 소속학과, 학과장으로 컬럼이 구성된 테이블이 있다.

학번을 기본 키로 하여 이름, 소속학과, 학과장이 학번에 종속된다.
그러나 학과장은 소속학과 컬럼만으로도 종속되므로, 부분적인 종속관계가 존재한다.

2NF를 만족시키기 위해 다음과 같이 구조를 변경할 수 있다.


3NF 제3 정규화


제3 정규화란 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다.

여기서 이행적 종속이란 A->B, B->C가 성립할 때 A->C가 성립되는 것을 의미한다.

더 쉽게 설명하면 기본 키를 제외하고 다른 column에 의해 결정되는 데이터를 없애는 것이다.

다음은 2NF를 만족한 테이블이다.

course를 기본 키로하여 department와 lecturer이 course에 종속된다.

이 때, department를 lecturer이 결정하여, 종속관계가 있는 것을 확인할 수 있다.

3NF를 만족하기 위해 테이블을 다음과 같이 분리할 수 있다.


BCNF


BCNF 정규화란 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분리하는 것이다.

다음과 같이 3NF를 만족하는 테이블이 있다.

다음과 같은 제약사항이 있다고 생각해보자.

  1. 한 학생은 동일 과목에 대해 하나의 교수에게만 수강 가능
  2. 각 교수는 하나의 과목만 담당할 수 있다.
  3. 한 과목은 여러 교수가 담당 가능하다.

이를 분석하면,

  1. (학번 + 과목)은 교수를 결정 짓는다.
  2. 교수는 과목을 결정 짓는다.
  3. 즉, 교수 또한 결정자인데 교수는 학번을 결정 지을 수 없으므로 후보키는 아니다.

이 상황에서 다음과 같이 BCNF를 만족하는 구조로 변경할 수 있다.


REFERENCE


https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%A0%95%EA%B7%9C%ED%99%94
https://www.w3schools.in/dbms/database-normalization
https://vertabelo.com/blog/normalize-2nf-3nf/
https://itwiki.kr/w/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%A0%95%EA%B7%9C%ED%99%94
https://mangkyu.tistory.com/110#:~:text=%5B%20%EC%A0%95%EA%B7%9C%ED%99%94(Normalization)%EC%9D%B4%EB%9E%80%3F,%EC%9A%A9%EB%9F%89%20%EC%97%AD%EC%8B%9C%20%EC%A4%84%EC%9D%BC%20%EC%88%98%20%EC%9E%88%EB%8B%A4.

profile
그때는맞고지금은틀리다

0개의 댓글