본문 바로가기

별걸다하는 IT/데이터베이스 Database

[데이터베이스 DBMS] 정규화에 대해서 알아보자~! 정규화를 해야하는 이유와 필요성, 제1정규화에 대해서

반응형

[데이터베이스 완전정복 목차!]

안녕하세요~!!

오늘도 찾아온 양햄찌블로거 입니다.

다른 카테고리에 비해 디비관련 글 개수가 적은 것 같아 요새 포스팅을 좀 늘리려고 노력하고 있어요 ㅎㅎ

 

오늘은 뭐에 대해 쓸까 하다가 정규화에 대해 작성해보려고 합니다. 

 

 

정규화란 무엇인가? 정규화가 중요한가? - NORMALIZATION of DBMS

정규화라는 단어를 들으면 좀 어렵게 느껴질 수 있는데,

쉽게 말하면 거지같이 테이블 짜고 아무렇게나 쑤셔넣었다가는 원하는 정보를 관리하기 어려워 추후 업무가 고달파질 수 있는데, 중복 데이터를 최소화 하는 등 여러 사항을 고려해서 이쁘게 설계를 해 생길 수 있는 문제들을 방지하자 입니다. ㅋㅋ

그러니 당연히 정규화 작업은 중요하겠죠?

 

근데 어떻게 설계를 해야 잘 짜는 것일까? 

그렇게 설계하면 어떤 나쁜 점을 피할 수 있고 왜 좋은 것일까? 에 대한걸 여러 단계로 정의를 해놨는데 

그게 정규화이고 1정규화, 2정규화, 3정규화 등등 레벨이 존재하는 거예요. 하나씩 나쁜걸 차례대로 지워간다 생각하믄 됌. 마치 오염수를 정수로 정제하듯, 첫 번째 거르고 두 번째 소독하고 등등 단계별로~

 

사실, 실제 회사에 가면 내가 배웠던 것 만큼 정규화에 따라 테이블이 잘 나눠져있지 않고 

하나의 테이블에 여러 데이터를 모두 때려넣는 상황도 꽤 많습니다.

그건 약간 비용과도 관계가 있는데요, 정규화대로 여러 테이블을 나누면 그만큼 비용이 더 발생하니까, 어떤 것에 우선순위를 두느냐에 따라 채택하는게 다를 수 있어요. 어디까지 허용할것인가 또한 설계자의 몫이겠죠. 암튼 정규화는 알아둬야할 기본에 속하죠 ㅎㅎ

 

DBMS 정규화는 영어로 database normalizatoin이라고 합니다.

 

정규화 목표 및 이유

좋은 관계 데이터베이스 스키마를 설계하는 목적은 정보의 중복과 갱신 이상이 생기지 않도록 하고, 정보의 손실을 막으며, 실세계를 훌륭하게 나타내고, 애트리뷰트들간의 관계까 잘 표현되는 것을 보장하며, 어떤 무결성 제약조건의 시행을 간단하게 하며 아울러 효율성 측면도 고려하는 것이다.

-출처 from 오라클기반으로 하는 데이터베이스 배움터

 

데이터를 중복으로 저장하면 일관되지 않은 데이터, 비정상적인 삽입 갱신 삭제 처리, 디스크 공간 낭비 등 많은 문제를 일으킨다. 정규화는 중복 데이터를 저장하면서 일으키는 문제점을 없애려고 정보를 주제별로 분할하는 프로세스를 의미한다. 

-출처 from SQL 코딩의 기술

 

정규화를 통해 우케 이게 가능한지는 단계별 하나하나씩 보면 이해되실거예요.

 

정규화 종류, 정규화 단계

정규화는 이렇게 여러 단계가 있는데,

 

 

보통 3NF 3정규화까지만 해도 충분(?)하다고 합니다. 

참고로 정규화 이론은 Codd가 1972년에 처음 제안하였습니다.

오늘은 가장 처음 단계에 있는 제1정규화에 대해 살펴보고 다음 포스팅에서 나머지도 차차 살펴보기로 해요.

 

제1정규화 1NF란?

첫단계 제 1정규화에서는 무엇을 하는지 살펴볼까요?

 

제1정규형 정의 

한 릴레이션이 제 1정규형을 만족할 필요충분조건은 릴레이션의 모든 애트리뷰트가 원잣값만을 갖는다.

 

자 이게 무슨말이냐, 이렇게 쓰면 어려워보이지만 쉽게 말하면, 하나의 열 (=속성=애트리뷰트)에 여러 데이터를 한꺼번에 넣어 저장하지 말고 하나만 넣으라는 겁니다. 이런게 있으면 없도록 정제하란 얘기얘요.

제1정규화 필요예시

그 유명한 수강테이블을 예시로 하나 볼까요?

제가 학원에 등록했어요 이를 저장하려고 해요.

그래서 간단하게 '수강생번호, 성명, 수강하는 과목' 을 저장하는 테이블을 만들었다고 합시다.

 

첫 번째 1-1 예시

 

한 학생이 하나의 과목만 듣는건 아니겠죠 여러개 수강할 수도 있어요. (3번째 4번째 행)

그럼 위처럼 테이블이 작성될거예요. 

 

모든 애트리뷰트가 원잣값만 갖는다는 말은, 각각 열에 3번째 4번쨰처럼 여러개의 데이터가 들어가면 안되고 단 하나의 데이터만 들어가야 한다는 겁니다.

어떤 학생이 같은 과목을 듣는가? 이 질의에 검색하기 어렵겠죠? 검색에도 불편하고,,, 물론 LIKE나 SUBSTRING을 중간 데이터를 추출해 검색하는 방법도 있겠지만 이는 효율성이 떨어지죠.

과목 담당 선생님 테이블 정보가 따로 있다고 했을 때, 이를 매칭하기도 쉽지 않겠죠.

익명이가 듣는 과목에서 '국어' 과목만 드랍한다고 해도, '수학, 국어' 속성의 전체 내용을 수정해줘야 하고.. (빼먹는다던가 실수를 야기할 수도 있어요. 건드릴 필요없는 데이터에 손대야하는거죠.)

이외에 각각의 값을 구분하기도 어렵고.. 조금만 생각해보면 논리적이지 않은 설계라는 것을 발견할 수 있어요.

 

 

1-2 예시

 

더 완벽한 이해를 위해 동일한 유형으로,,,

자 제가 홈플러스에서 5000원에 계란하고 우유 두 개의 식품을 구매했다고 가정해봅시다. 

 

구매번호 가지고 제가 구매한 품목을 구분 할 수 있나요?? 

없죠!!! 한 컬럼에 정보가 다 때려들어가있으니 구분이 안돼요 이럴 경우 제1정규화가 필요한겁니다.

 

만약 이게 하나의 데이터로 들어가 있으면 품목에 있는 원자값과 상품코드 값을 연결시켜서 손쉽게 우유라는 것을 확인할 수 있어요. 하지만 위와 같은 설계는 한눈에 확인하기도 어렵고,구분하기도 어렵고, 검색하기도 어렵고,,  구매한 품목을 구별짓기도 어려워요. 

 

두 번째 예시 2-1

 

위 경우는 좀 다르지만 이와 같은 상황도 제1정규화 대상이 됩니다.

한 컬럼에 원자값을 가지고 있어 아무문제 없어 보이지만, 컬럼 수를 늘렸을 뿐 수강과목1이나 수강과목2나 담고자 하는 내용은 동일하기 때문이죠. 이렇듯 동일한 성격의 데이터를 여러 컬럼에 저장하는 것도 문제를 발생시킵니다. 

 

만약 수강하는 과목의 개수가 늘어날 때마다 그에 맞춰 속성을 더 늘려야 한다는 문제점이 있고, 그런데 수강하는 과목이 없는 학생이 존재할수록 빈 슬롯이 많이 발생하기 때문입니다.

 

제1 정규화 반영 결과

그럼 이를 어떻게 바꿔야 할까요?

 

 

요렇게 중복되는 값을 두 개의 행(=레코드)로 분리하는 겁니다.

이렇게 하면 수강과목을 제외한 데이터가 중복되는 문제가 발생하긴 하나, 데이터의 논리적 구성을 위해 이 부분은 감수하는 거겠죠. 물론 이때에도 중복데이터들로 갱신이상이 발생할 수 있습니다. (예를 들어 수학과목을 듣고 있는 익명이 이름을 용용이로 바꿔달라는 요청이 있을 때, 3번 뿐만아니라 4번 행의 이름도 동일인물이므로 용용이로 변경해줘야 하는데 3번 행만 변경해서 데이터간 불일치가 발생하는 이런 경우를 갱신이상이라고 합니다)

 

그리고 수강생번호만으로는 레코드를 유일하게 식별할 수 없으니 프라이머리키(주키)를 (수강생번호+수강과목) 복합키로 사용해야 할 거예요.

 

테이블 분리

 

그런데 차수가 3이니까 다행이지 만약에 차수가 한 30이랬으면, 수강과목에 복수값 분리하고자 29개의 값이 중복될 수 있는거네요??  이럴 경우 이렇게 테이블을 분리해서 해결할 수도 있습니다. 

이렇게 나누면 위에서 보았던 갱신이상도 막을 수 있겠지요 ㅎㅎ

 

오늘은 간단하게 정규화에 대한 개념과 그 첫 번째 단계 제1정규화에 대해 알아보았어요 ㅎㅎ

다음 포스팅에서는 남은 정규화 방식에 대해서도 차차 알아보기로 해요.

 

▼제2정규화와 알아보는 결정자&종속자&종속관계: jhnyang.tistory.com/358

 

[데이터베이스 정규화] 제2정규화(2NF)와 알아보는 결정자와 종속자 그리고 그 관계 (완전 함수적

[데이터베이스 강좌 링크 바로가기] 안녕하세요~~ 양햄찌 주인장입니다. 저번 포스팅에서 정규화란 무엇인지! 정규화가 왜 필요한지에 대한 설명과 더불어 제1정규화를 간략하게 살펴보고 끝냈

jhnyang.tistory.com

도움이 되셨다면 공감/광고보답/댓글 중 하나로 마음을 전하는 건 어떤가요? 정보공유에 큰 동기부여가 됩니다.

오늘도 고생하셨어요 :)

반응형