개발놀이터

데이터베이스 정규화 본문

CS 지식/데이터베이스

데이터베이스 정규화

마늘냄새폴폴 2022. 12. 22. 02:33

이번 포스팅에선 이해하기 어렵기로 소문난 정규화에 대해서 포스팅해볼 생각입니다. 저도 정규화에 대해서 공부해야겠다고 마음 먹었지만 이렇게 이해하기 힘들었던 적은 없었던 것 같네요. 

 

워낙 말이 베베꼬여져 있으니까 예제와 함께 제가 말로 풀어서 설명해보도록 하겠습니다. 

 

 

정규화

정규화는 무엇일까요? 우선 정규화의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것입니다. 중복된 데이터를 허용하지 않음으로써 무결성을 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있습니다. 

 

저는 여기서 한가지 걸리더군요. 무결성은 또 뭔가?

 

정규화에 대해서 알아보기 전에 무결성을 유지할 수 있다고 하니 무결성에 대해서 조금만 알아보도록 하겠습니다.

 

 

무결성

무결성에는 크게 세가지가 있습니다. 개체 무결성, 참조 무결성, 도메인 무결성이 바로 그것이지요. 

 

하나하나 살펴보도록 하겠습니다. 

 

1. 개체 무결성

모든 테이블이 기본키로 선택된 필드를 가져야하고, 기볹키로 선택된 필드는 고유한 값을 가져야 하며, 빈 값은 허용하지 않는다. 

 

개체 무결성은 간단하죠. 다음은 참조 무결성입니다. 이것도 우리가 흔히 보던 내용입니다.

 

2. 참조 무결성

관계형 데이터베이스 모델에서 참조 무결성은 참조 관계에 있는 두 테이블의 데이터가 항상 일관된 값을 갖도록 유지되는 것을 말합니다. 말이 좀 어려운데 예제와 함께 보시죠

 

위의 상황은 '전공' 테이블과 '학생' 테이블이 외래키로 참조되어있는 상황입니다. FK로 dept_id를 가지고 있는 '학생' 테이블이 부모 테이블처럼 보이네요. 

 

우리는 잘 알다시피 외래키로 묶여 있는 테이블의 튜플중 삭제를 진행하려면 자식테이블부터 삭제해야 한다는 것을 알고 있습니다. 무결성 제약조건이죠? 참조 무결성이 바로 이런 의미입니다. 

 

다음은 도메인 무결성입니다. 이것은 앞에것보다 더 쉽습니다.

 

3. 도메인 무결성

도메인 무결성은 테이블에 존재하는 필드의 무결성을 보장하기 위한 것으로 필드의 타입, NULL값의 허용 등에 대한 사항을 정의하고, 올바른 데이터의 입력되었는지를 확인하는 것입니다. 예를 들어서 주민등록번호 필드에 문자가 입력되는 경우는 도메인 무결성이 깨지는 경우라고 볼 수 있습니다. 

 

 

이렇게 무결성에 대해서 잠깐 알아봤습니다. 우리가 다 알고있는 쉬운 내용이라 이해하는데 어렵지 않았을 것입니다. 

 

그럼 이제 정규화로 돌아와볼까요? 정규화는 이런 '무결성을 유지하기 위해 하는 행위' 정도로 정리하면 될 것 같습니다. 

 

 

정규화에는 크게 네가지가 있습니다. 제 1 정규화, 제 2 정규화, 제 3 정규화, BCNF 정규화 이렇게 넷이죠. 하나씩 알아볼까요?

 

제 1 정규화

제 1 정규화란 테이블의 컬럼이 하나의 값만 갖도록 테이블을 분해하는 것입니다. 예를 들어 아래와 같은 고객 취미 테이블이 존재한다고 생각해봅시다. 

 

위의 테이블에서 추신수와 박세리는 여러개의 취미를 갖고 있기 때문에 제 1 정규형을 만족하지 못하고 있습니다. 때문에 이를 제 1 정규화를 통해 분해할  수 있습니다. 제 1 정규화를 진행한 테이블은 아래와 같습니다. 

 

여기까지는 어렵지 않을 것이라고 생각됩니다. 정리하자면 제 1 정규화는 하나의 컬럼에 하나의 값만 가져야 한다는 것입니다. 

 

 

제 2 정규화

제 2 정규화란 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것입니다. 여기서 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어서는 안된다는 것을 의미합니다. 

 

말이 정말 어렵습니다... 우선 우리는 이 부분을 집중해야합니다. '기본키의 부분집합이 결정자가 되어서는 안된다'

 

이것이 제 2 정규화의 전부입니다. 일단 잘라서 다시 볼까요? 

1. 기본키의 부분집합이

2. 결정자가 되어서는 안된다. 

 

이 부분집합이라는 것도 거슬립니다. 다시 풀어서 말하면 '기본키에 속하지만 기본키는 아닌 것이' 라고 풀어 쓸 수 있습니다. 기본키에 속한다..? 이것도 좀 애매하네요 기본키에 속하지만 기본키는 아니라는 의미는 복합키의 경우를 예시로 들 수 있습니다. 

 

복합키는 기본키는 아니지만 기본키와 같은 속성을 가지고 있죠. 

 

여기까지 1번에 대해서 설명했는데 2번에서 또 거슬리는 단어가 있습니다. 바로 '결정자'이지요. 

 

예시와 함께 결정자가 무엇인지 보도록 하겠습니다. 

 

이 테이블에서 기본키는 학생번호, 강좌이름으로 복합키입니다. 그리고 이 복합키는 성적을 결정합니다. 

(학생번호, 강좌이름) --> (성적)

 

여기서 결정하는 것이 하나 더 있습니다. 

(강좌이름) --> (강의실) 바로 이것이죠 

 

즉, 기본키의 부분키인 강좌이름이 결정자이기 때문에 위의 테이블의 경우 다음과 같이 기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리하여 제 2 정규형을 만족할 수 있습니다. 

 

 

즉 다시 정리해보면 다음과 같습니다. 

1. 기본키의 부분집합이 (기본키에 속하지만 기본키는 아닌 것이)

2. 결정자가 되어서는 안된다 (기본키처럼 어떤 값을 결정지으면 안된다)

 

위의 예제에선 강좌이름이 부분키로 기본키에 속하지만 기본키가 아닌 것이 기본키처럼 어떤 값(강의실)을 결정지었기 때문에 제 2 정규화에 어긋났던 것입니다. 

 

 

제 3 정규화

제 3 정규화란 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것입니다. 여기서 이행적 종속이라는 것은 A -> B, B -> C가 성립할 때, A -> C가 성립되는 것을 의미합니다. 

 

예를 들어서 아래의 테이블이 바로 그런 경우죠

 

학생 번호는 강좌 이름을 결정짓고 강좌 이름은 수강료를 결정짓습니다. 따라서 이 관계에서는 학생 번호가 수강료를 결정짓는 이상한 상황이 발생합니다. 따라서 제 3 정규화에 의해 이 관계는 두개의 테이블로 분해되어야 합니다. 

 

개념은 이해하기 쉬웠을 것 같습니다. 그러니까 정리하자면 이러한 이행적 종속 관계가 하나의 테이블에서 일어나면 안된다는 의미입니다. 

 

 

BCNF 정규화

BCNF 정규화란 제 3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것입니다. 우리는 앞에서 결정자가 무엇인지 정의했습니다. 그럼 후보키는 무엇일까요? 

 

후보키는 데이터베이스의 여러 키 중 하나인데 기본키가 될 수 있는 말그대로의 '후보'들 입니다. 

 

 

위의 테이블에서 기본키는 (학생번호, 특강이름) 입니다. 그리고 기본키는 교수를 결정하고 있는 결정자이지요. 또한 여기서 교수는 특강 이름을 결정하고 있습니다. 

 

어 이건 제 3 정규화에서 봤던 이행적 종속에 해당하는게 아닌가요? 라고 하실 수 있습니다. 

 

하지만 아닙니다! 위의 테이블에서는 학생번호가 특강이름을, 교수가 특강이름을 결정하기 때문에 굳이 따지자면 A -> B, C -> B 의 관계입니다. 

 

자 그럼 학생번호는 PK이기 때문에 결정자라고 해둡시다. 그럼 교수는 어떤가요? 교수는 특강이름을 결정짓는 결정자이지만 PK가 아니기 때문에 아무것도 아닙니다. 

 

이러한 상황에서 BCNF 정규화는 결정자로 존재하는 것들은 반드시 후보키가 되어야 한다는 의미입니다. 

 

 

 

여기까지 데이터베이스의 정규화에 대해서 알아봤습니다. 저도 이해하는데 엄청 고생했는데 말로 풀어 쓰자니 더 어렵네요. 잘 이해가 되셨을지 모르겠습니다. 

 

저도 아직 아리송한 부분이 많아서 면접준비로 다시 정리해보는 시간을 가져야 할 것 같습니다. 

 

긴 글 읽어주셔서 감사합니다. 다음 포스팅에서 봬요!

 

 

출처

https://mangkyu.tistory.com/110

 

[Database] 정규화(Normalization) 쉽게 이해하기

지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz

mangkyu.tistory.com

 

https://untitledtblog.tistory.com/123

 

[관계형 데이터베이스] - 무결성 (Integrity)

1. 데이터의 무결성 데이터의 무결성은 데이터의 정확성, 일관성, 유효성이 유지되는 것을 말한다. 데이터의 무결성을 유지하는 것은 데이터베이스 관리시스템 (DBMS)의 중요한 기능이며, 주로 데

untitledtblog.tistory.com

 

https://coding-factory.tistory.com/220

 

[DB기초] 여러가지 키(기본키,후보키,외래키등)의 종류와 개념

키(Key)란? : 키는 데이터베이스에서 조건에 만족하는 튜플을 찾거나 순서대로 정렬할 때 튜플들을 서로 구분할 수 있는 기준이 되는 애트리뷰트를 말한다. 키(Key)의 종류 후보키(Candidate Key) 1. 후

coding-factory.tistory.com