
안녕하세요 :0
오늘도레벨1입니다.
오랜만에 돌아왔습니다.
요근래 너무 바쁘다보니
여러모로 정신이 없네요..ㅎ
지난 포스팅에서는 성능 데이터 모델링의
개요적인 내용을 학습해 보았는데요.
이번 포스팅에서는 정규화라는 것에 대해서
그리고 정규화를 통해 성능을 향상시키는
방법에 대해 학습해보겠습니다.
성능 데이터 모델링의
개념이 아직 낯설다면
본 포스팅을 학습하기 전에
아래 링크의 지난 포스팅을
확인 부탁드립니다.
1. 성능 데이터 모델링 개요
안녕하세요 :0 오늘도레벨1입니다. 벌써 한 주가 흘러가고 금요일에 도달했네요! 요즘 밤날씨가 선선하니 야장이 땡기는 나날입니다. 이번 주말에는 연인/친구/가족들과 피크닉도 가시면 좋을
seung9-it.tistory.com
그럼 이번 시간도
본격적으로 한번 시작해볼까요?
우선 정규화가 무엇인지 알아야겠죠?
정규화란
데이터베이스 설계에서
"중복을 최소화"
하여 데이터의 일관성을 유지하고
데이터의 무결성을 보장하기 위해 엔터티를
쪼개는 방법이다!라고 이해하시면 됩니다.
정규화를 할 경우 조회성능은
처리 조건에 따라 향상되는 경우도 있고
저하되는 경우도 있지만 일반적으로
수정, 입력, 삭제 성능이 향상되죠.
함수 종속성에 대한 개념을
알고 있으면 더욱 쉽게 이해하실 수
있겠지만 이후 여러가지 차수의
정규화 사례를 보다보면
종속의 개념이 자연스럽게
이해되지 않을까 생각이 드네요 :)
정규화는 1차부터 6차까지
존재하고 있는데요.
각각의 정규화들이
어떻게 등장했는지
짤막하게 살펴보겠습니다.
정규화는 1970년대에 Codd라는
사람이 처음으로 제안을 했습니다.
Codd는 데이터의 일관성, 타당성,
최소화, 불변성을 보장하기 위해서
데이터 정합성이라는 것을 제시했고
이 때, 관계형 데이터베이스 모델링에서
중복을 제거하는 1차/2차/3차 정규화가 등장하죠.
이후 Codd가 속한 IBM에서 함께 일하던
동료인 Boyce라는 사람이 1차/2차/3차로도
해결되지 않는 경우가 있다며 Codd와 함께
Boyce-Codd 정규화라는 것도 발표를 하게 되죠.
그리고 이후에도 Fagin이라는 사람이
함수 종속성 이외에도 정규화가 발생된다며
4차/5차/6차 정규화에 대해서 발표를 했죠.
하지만 4차/5차/6차 정규화는 고도의
데이터 분석 작업에 한정되고 거의 사용되지
않는다고 보시면 되고, 저희도 1차/2차/3차
정규화에 대한 내용만 다루어볼 예정이니
참고를 부탁드리겠습니다.

그럼 정규화의 간단 개념과
등장 배경에 대해 알아보았으니
본격적으로 각각의 정규화를
조금 더 자세하게 알아보시죠!
우선 1차 정규화입니다.
(또는 제1정규형이라고도 합니다.)
1차 정규화는 복수의 속성값을
갖는 속성을 분리하고 PK(Primary Key)에 대한
원자성(Atomic Value)을 확보하고자 합니다.
쉽게 말해 모든 속성은
반드시 하나의 값만 가져야 한다는
뜻이라고 생각하시면 됩니다.
아래의 예시를 보겠습니다.
이름 | 소속 | 강의과목 |
김교수 | 데이터사이언스학과 | SQLD, ADsP, DAsP |
김교수의 강의 과목컬럼에
속성값이 여러개가 들어갔군요.
이러한 겨우를 1차 정규화 대상이라고
말할 수 있고 1차 정규화를 수행할 수 있습니다.
그리고 위의 예시 테이블을
1차 정규화하면 다음과 같이
두 개의 테이블로 분리됩니다.
[테이블: 교수]
이름 | 소속 |
김교수 | 데이터사이언스학과 |
[테이블: 강의과목]
이름 | 강의과목 |
김교수 | SQLD |
김교수 | ADsP |
김교수 | DAsP |
예시로만 보았을 때는
굳이 저렇게 까지 해야해?
할 수 있지만 실제 데이터는
그 수를 헤아릴 수 없을만큼 방대하므로
저런 사소한 속성값 중복 문제가
큰 문제가 될 수 있답니다.

자, 다음으로는 2차 정규화니다.
2차 정규화는 주 식별자 전체에
종속적이지 않은 속성을 분리하는 것으로
부분 종속 속성 분리라고도 합니다.
다시 말해, 엔터티의 모든 일반속성은
반드시 모든 주식별자에 종속되어야 한다인데
쉽게 말해서 2차 정규화는 PK가 2개 이상일 때
일반 속성이 일부 PK에만 종속될 때 발생하는 현상입니다.
예시를 보는게 이해가 더 쉽겠죠?
아래와 같은 테이블 있다고 해보겠습니다.
주문코드(PK) | 제품코드(PK) | 주문수량 | 제품명 |
A001 | 0001 | 3 | 반팔티 |
A002 | 0002 | 2 | 긴팔티 |
A003 | 0001 | 4 | 반팔티 |
이 때, 일반 속성인 제품명이
제품코드에만 종속되고 있습니다.
이러한 경우 2차 정규화가 필요하게 되고
정규화 진행 결과 다음과 같습니다.
[테이블: 주문]
주문코드 | 제품코드 | 주문수량 |
A001 | 0001 | 3 |
A002 | 0002 | 2 |
A003 | 0001 | 4 |
[테이블: 제품]
제품코드 | 제품명 |
0001 | 반팔티 |
0002 | 긴팔티 |
예시를 보니 더욱 쉽게
이해가 되시지 않나요?

그럼 마지막으로 3차 정규화를
알아보도록 하겠습니다.
3차 정규화는 주식별자가 아닌
모든 속성 간에는 서로 종속될 수 없다는 것입니다.
쉽게 말해 일반속성끼리 종속이
발생할 경우 문제가 된다는 이야기인데요.
이 또한, 예제를 통해
알아보도록 하겠습니다.
아래와 같은 테이블이 있습니다.
사원번호(PK) | 이름 | 전화번호 | 부서코드 | 부서명 |
001 | 안군 | 010-****-**** | B01 | 개발팀 |
002 | 허양 | 010-****-**** | B02 | 인사팀 |
위의 예제 테이블에서
문제점이 보이시나요?
그건 바로 부서명이라는 일반 속성이
부서코드라는 일반 속성에 종속된다는 것입니다.
그럼 3차 정규화를 진행해볼까요?
아래와 같이 2개의 테이블로 쪼개면 됩니다.
[테이블: 사원정보]
사원번호(PK) | 이름 | 전화번호 | 부서코드 |
001 | 안군 | 010-****-**** | B01 |
002 | 허양 | 010-****-**** | B02 |
[테이블: 부서]
부서코드 | 부서명 |
B01 | 개발팀 |
B02 | 인사팀 |
역시나 어렵지 않죠?
이렇게 이번 시간에는
정규화에 대해서 알아보았습니다.
물론 앞서 언급하였듯이
정규화가 항상 성능의 향상을
가져오는 것은 아니므로
주의하는 것이 좋습니다.
오히려 지나친 정규화는
오히려 성능 조화를 가져올 수도 있죠.
그래서 그런 경우에는 중복을 허용하면서
성능을 향상시키는 반정규화라는 방법이
등장하는데 반정규화에 대한 내용은
다음 포스팅에서 다루어 보도록 하겠습니다.
그럼 이번 포스팅은 여기서 마무리 짓고
다음 포스팅으로 찾아뵙겠습니다.
행복한 연휴되세요!

구독과 좋아요는 제게 큰 힘이 됩니다 :)

'Lv02. 디비~DB~딥! > 2. SQLD : 데이터 모델과 성능' 카테고리의 다른 글
3. 반정규화(De-Normarlization) (2) | 2023.06.04 |
---|---|
1. 성능 데이터 모델링 개요 (3) | 2023.05.12 |