본문 바로가기

학교 공부/Database

데이터베이스 정규화 (1NF, 2NF, 3NF, BCNF)

오늘 알려드릴 데이터베이스 이론의 개념은

 

정규화입니다

정규화는 릴레이션이 중복되지 않게 효과적으로 데이터베이스 내에 표현해서

나중에 연산을 할 때 많은 비용이 소모되는 것을 방지하고

이상 현상을 방지하는 것을 목적으로 합니다

(이상 현상에 대해서는 나중에 포스팅을 하겠습니다)

 

너무 정교하고 엄격한 정규화는 오히려 전체 데이터베이스의 성능을 저하시키기 때문에

개념을 잘 알아두시고 사용하는 것이 좋습니다

 

일단 정규화 단계는

1NF / 2NF / 3NF / 4NF / 5NF / BCNF

총 6개로 구성돼있습니다

 

하지만 저는 1~3NF와 BCNF만 알려드리겠습니다

 

이 설명을 보시고 완벽하게 이해하시기는 어려울 수도 있습니다

하지만 여러분들이 정규화에 대한 약간의 감을 잡으셨으면 하는 맘으로

아주 쉽게 작성했다는 점 알아두시기 바랍니다!!!

 

1. 1NF(제 1정규화)

일단 1NF입니다

1NF는 모든 튜플은 여러 개의 값을 가질 수 없다는 개념이 필요합니다

즉, 원자성을 생각하시면 됩니다

비정규형 테이블

이 비정규형 테이블을 보시면 회색 튜플의 '수업' 속성에 값이 두 개가 들어있습니다

'운영체제'와 '알고리즘'

이렇게 두 개의 값을 가지고 있어서 이 테이블은 1NF를 위반하는 테이블입니다

그래서 튜플을 분리해줘야 합니다

 

튜플을 분리한 1NF

위 테이블처럼 두 개의 튜플로 분리를 해주셔야 1NF를 만족하는 테이블이 됩니다

 

1NF는 쉽습니다 그냥 두 개의 값이 한 튜플에 들어있으면 분리만 해주면 됩니다

 

2. 2NF(제 2정규화)

2NF는 1NF를 만족하고

기본키에 포함되는 일부 속성에 종속되는 속성을 분리해줘야 합니다

이게 무슨 소리냐면

1NF를 만족하는 테이블

위의 테이블의 기본키는 {'학번', '수업'}입니다

하지만 '학년' 속성을 보면 '학번' 속성에만 종속적인 것을 알 수 있습니다

 

여기서 종속적이라는 말은

'어떤 속성 A로 인해 속성 B의 값이 식별된다'의 의미입니다

이때 속성 A를 결정자라고 합니다

정규화를 공부하다 보면 자주 나오는 말이니 알아주시기 바랍니다

 

고로 기본키를 구성하는 속성 중의 일부('학번'속성)에만 '학년'의 값이 식별되므로

테이블을 분리해주셔야 합니다

분리된 테이블1
분리된 테이블2

이렇게 두 개의 테이블로 분리해야만 2NF를 만족한다고 할 수 있습니다

(사진을 나란히 놓고 싶은데 그렇게 하면 사진이 엄청 커지네요...)

 

2NF를 할 때 잘 보셔야 하는 점은

부분 함수 종속입니다

기본키가 아닌 속성들이

기본키의 구성 요소 중 일부 속성에만 종속적인 속성이 보인다면

그것은 2NF를 위반해서 분리해줘야 한다는 점을 기억하세요

 

3. 3NF(제 3정규형)

다음은 3NF입니다

2NF는 부분 함수 종속이라는 말을 썼다면

3NF는 이행적 함수 종속이라는 말을 쓰겠습니다

 

이행적 함수 종속이란

함수 종속 관계 중 하나인데요

(이것도 나중에 기회가 된다면 포스팅하겠습니다)

쉽게 이해하시기 위해 우리가 잘 아는 삼단논법을 인용하겠습니다

삼단논법은 B는 A에 종속되고(A->B), C는 B에 종속될 때(B->C)

C가 A에 종속되는 것(A->C)이라고 생각하면 됩니다

이것이 이행적 함수 종속이라고 합니다

2NF 테이블

3NF는 2NF를 만족하면서 모든 속성이 이행적 함수 종속이 없는 경우입니다

위의 테이블의 기본키는 '학번' 속성을 기본키로 하고 있습니다

여기서 기본키가 아닌 '학과' 속성만으로도 '지도교수' 속성을 식별할 수 있습니다

이러면 두 개의 테이블로 분리해도 문제가 없고

내가 '학번'과 '학과'만 필요할 때 굳이 '지도교수' 속성을 안 거쳐서 사용할 수 있습니다

 

분리되서 만들어진 학생 테이블
분리되서 만들어진 학과 테이블

이렇게 정규화를 거친 테이블입니다

분리할 때 주의해야 할 점은 학생 테이블의 '학과' 속성을 외래키로 설정해줘야 합니다

그래야 두 테이블이 서로 연결돼서 같이 사용될 수 있습니다

 

3NF는 삼단논법과 비슷한 이행적 함수 종속 개념

그리고 기본키가 아닌 다른 속성에 종속되는 것을 찾아서 분리해야 한다

이 두 가지를 알고 있으시면 감이 잡히실 겁니다

 

4. BCNF(보이스-코드 정규화 : Boyce-codd NF)

마지막으로 BCNF입니다

이건 제가 공부할 때도 정말 헷갈리고 이해하기 힘들었습니다

그래도 일단 감을 잡으면 이해하기 쉬워지실 거예요

 

일단 개념은 후보키가 아닌 속성이 함수적 종속되는 것을 제거한다고 합니다

...??? 이게 뭔 댕소리인가 싶으실 거예요

저도 그랬습니다...;;;ㅎㅎ

 

일단 테이블을 보겠습니다

3NF 학생 테이블

이 테이블의 기본키는 {'학번', '과목'}입니다

BCNF는 위와는 다르게 접근해야 합니다

바로 이상 현상을 생각하셔야 됩니다

 

이상 현상은 간단하게 말하자면 데이터 테이블을 조작할 때

데이터가 사라지거나 삽입할 수 없는 경우가 생기는 것입니다

 

이상 현상의 종류는

삭제 이상, 삽입 이상, 갱신 이상이 있습니다

이상 현상에 대한 개념은 나중에 포스팅을 꼭 하겠습니다.

 

일단 삽입 이상부터 살펴보겠습니다

만약 '홍정민'이라는 교수님이 '웹 프로그래밍'이라는 과목을 신설하신다고 가정합니다

이때 데이터베이스에 정보를 삽입하려면 듣고 있는 학생의 '학번'이 있어야 삽입이 가능합니다

아직 신청도 못 받는 신설 과목인데 학번이 있을 리가 없죠

그래서 '삽입 이상'이 나타납니다

 

갱신 이상도 살펴봅시다

만약 '전지환' 교수님께서 담당하시는 과목이 바뀌게 되면

수강생이 듣는 과목도 갱신을 해줘야 합니다

그런데 갱신 도중 문제가 생겨서 일부만 갱신이 되는 경우가 있습니다

 

마지막으로 삭제 이상도 살펴보겠습니다

만약 '202'라는 학번을 가지고 있는 학생이

자퇴를 한다면..??

202 학생에 대한 정보가 사라질 것이고

열심히 네트워크 수업을 하신 홍석영 교수님의 데이터도 사라져서

홍석영 교수님은 해당 학기에 수업을 안 한 것이 됩니다.

(전지환 교수님과 최진혁 교수님은 101학번 학생이 살렸네요)

 

이렇게 테이블 내부에서 문제를 찾는 것이 아니라

외부의 영향으로 문제가 생기는 경우이기 때문에 이해하기 힘드셨을 것입니다

 

그래서 테이블을 분리하는 것이 아니라 생성을 해줘야 합니다

교수님 테이블

이 테이블이 있어야 학생 테이블이 갱신이 되어도

교수님이 수업하신 데이터들은 남아있게 됩니다

그리고 새로 신설하는 과목도 이 테이블에 저장시키고

수강신청 서비스와 연동시킨다면 학생들도 과목을 신청할 수 있을 것입니다

 

그래서 BCNF는 이상 현상을 고려해야 한다!!

라고 생각하시면 감이 좀 잡히실 것입니다

 

제 첫 포스팅이 끝이 났네요 많이 부족하지만 

이렇게 감을 잡고 수업을 들으시면 그나마 도움이 되실 것이라고 생각합니다

 

저도 BCNF는 100% 이해하지는 못했습니다

그래서 많이 부족한 포스팅이라고 생각하네요

제 설명에 문제가 있다면 댓글 남겨주시면 감사하겠습니다

 

그럼 다음 포스팅 때 뵙겠습니다!!!

'학교 공부 > Database' 카테고리의 다른 글

DB에서 사용하는 여러 Key들[PK, FK, ...]  (0) 2021.06.17
반정규화란?  (0) 2021.03.29