[데이터베이스 강좌 링크 바로가기]
안녕하세요~~ 양햄찌 주인장입니다.
저번 포스팅에서 정규화란 무엇인지! 정규화가 왜 필요한지에 대한 설명과 더불어 제1정규화를 간략하게 살펴보고 끝냈었는데요. 오늘은 그 포스팅에 이어서 제2정규화에 대해 알아보려고 합니다.
정규화의 목적에 대한 개념은 당연히 알고 있다는 가정하에 진행할거예요!
혹시 이전 포스팅을 보지 못하신 분은 아래 링크를 참고해주세요
▼ 정규화란 무엇인가, 그시작 제1정규화: jhnyang.tistory.com/357
[데이터베이스 DBMS] 정규화에 대해서 알아보자~! 정규화를 해야하는 이유와 필요성, 제1정규화에
[데이터베이스 완전정복 목차!] 안녕하세요~!! 오늘도 찾아온 양햄찌블로거 입니다. 다른 카테고리에 비해 디비관련 글 개수가 적은 것 같아 요새 포스팅을 좀 늘리려고 노력하고 있어요 ㅎㅎ 오
jhnyang.tistory.com
제 2정규화 2NF (Second Normal Form)
제 1정규형 테이블이 제 2정규형을 충족시키는 필요충분조건: 후보 키 K와 K에 속하지 않는 속성 A가 있을 때 A를 결정하기 위해 K의 일부가 아닌 K 전체를 참조해야만 하는 경우 1NF 테이블은 2NF이다.
제2정규형에 대한 정의는 이와 같습니다. 엄청 어렵게 들리죠?ㅎㅎ 말만 어려운거;;
보고 나면 이해될거예요.
예시로 저번에 제1정규화 시행 이후 결과 테이블을 가져왔어요. ㅎㅎ 여기에 좀 더 풍성해보이라고 몇 가지 컬럼을 추가해줬습니다. 자 여기서 기본키는 {수강생번호, 수강과목} 두 개 컬럼으로 구성된 복합키예요. 구분하기 쉽게 컬럼명에 밑줄쳐놨어요 ㅎㅎ
이 테이블과 같은 설계가 좋지 않은 이유는 무엇일까요?
일단 중복데이터가 많아 보이는건 한 눈에도 파악할 수 있죠.
수강생이 각기 다른 전화번호를 갖는다고 할 때, 전화번호는 수강생에 따라 결정되는 거라 수강생번호가 여러 행에 걸쳐 동일하게 있으면 전화번호도 그만큼 중복돼요.
요렇게 데이터가 중복되어있어요.
제 1정규형의 형태는 갖춰서 하나의 속성에 하나의 원잣값만 들어가있지만, 아직도 많은 이슈가 존재합니다.
이럴 경우 먼저 데이터의 정합성을 보장할 수 없어요.
수강생번호 1114의 전화번호는 동일해야하는데, 위 사진 보면 두 개의 전화번호가 다르게 들어가버렸어요! 실수던, 오류던 뭐든간에 이렇게 데이터 불일치가 발생할 수 있습니다. 지금이야 데이터가 많지 않지만, 수많은 데이터에서 이렇게 데이터가 일관적이지 않을 가능성이 있다면 이를 어떻게 발견할 수 있을까요. 추후 문제가 될 소지가 충분하겠죠.
갱신이상 발생
이 외에 갱신 이상이 발생할 수 있습니다. update 칠 때 어렵다는 말인데요
만약 병 학생이 핸드폰을 잃어버려서 핸드폰을 구매하면서 번호를 새로 받았다고 가정해봅시다.
010-7777-7777을 010-6666-6666으로 바꾸려고 하는데..! 하나만 변경한다고 제대로 수정된게 아니예요!!
중복되는 레코드가 10개면 10개행을 다 업데이트 쳐줘야하고 1000개면 1000개 행을 다 잡아서 업데이트 쳐줘야하죠.
뭐 잘 찾아서 갱신(update) 잘하면 딱히 문제는 없지만, 일치하는 모든 데이터를 찾아서 변경해줘야하니 복잡할수록 비정상적으로 갱신될 가능성이 있다는 게 포인트입니다.
공간낭비, 데이터반복 유발
자 만약에 '무'라는 학생이 학원에 상담을 받으러 왔어요. 상담만 받고 아직 수강신청을 한 상태가 아니라고 합시다.
어쨋든 학생에 대한 기록을 남기고 싶어요.
그러면 요렇게 들어갈수밖에 없겠죠. 과목을 수강한게 아니기 때문에 '수강과목, 담당선생님, 성적'모두 빈칸으로 들어가야해요.
빈 값을 지양하려면 과목을 수강한 다음에서야 정보를 입력할 수 있는건데, 이게 결국 그런 정보 그렇지 않은 정보 등, 여러 정보가 섞이게 되고 이에 따라 비정상 데이터가 들어갈 수 있겠죠. 상담할 때 추가하고, 그 뒤에 2차상담할때 추가된지 모르고 또 추가하고 수업 듣고 나서도 추가하고 이럴 경우 반복적 데이터도 많이 발생할겁니다.
제 2정규화 필요한지 판단하는 법
위와 같은 테이블이 반복데이터로 인해 좋지 않다는건 알겠으나 제2정규화가 필요한지 어떻게 판단할 수 있을까요?
테이블 논리성을 생각하면 좀 수월한대요.
하나의 테이블에는 그 목적에 맞는 데이터들이 들어가야 해요.
예를 들어 학생 테이블이면 학생 관련된것만 들어가야지 부가적인게 덕지덕지 붙으면 바운더리가 애매해지고 관리하기도 더 어렵죠.
사실 위 테이블은 학생 과목별 성적 테이블이잖아요?
그런데 핸드폰번호라던가 성명 이런건 학생에 관련이 있지 성적과는 전혀 관계가 없어요.
또 담당선생님의 경우 수강과목 정보에 해당하는거지 학생 과목별 성적과는 관계가 없죠. 학생 정보와도 관계가 없어요.
결국, 저 테이블에서 레코드를 분별하는 키는 {수강생번호, 과목}이고 저장하고자 하는 데이터는 '성적'인데,
수강생번호에 의해 결정되거나 과목에 의해 결정되는 적절하지 않은 관계의 데이터들이 섞여 있다는거죠! 이럴 경우 테이블 분리가 필요하고 이렇게 정제하는걸 제 2정규화한다고 하는겁니다.
머 쉽게 말하면 하나에 때려넣지 말고 목적에 맞게 분리해라 가 되겠네요.
애트리뷰트간 결정자, 종속자, 함수적 종속 관계란?
이를 판단하기 위해 좀 더 수학적인(?) 기준이 있는데요, 뭐 용어를 이용해 정리해둔거죠? 머 대강 요약하면 얽혀있는 종속관계를 분리한다 정도가 되겠습니다.
알아야 할 용어는 결정자와 종속자 그리고 종속관계 입니다.
어떤 컬럼 값(=애트리뷰터 값)은 다른 애트리뷰트 값을 고유하게 결정지을 수 있는데 이런 애트리뷰트를 결정자라고 합니다. 말그대로 바로 그 애트리뷰트에 의해 다른 값이 결정되기 때문에 붙여진 명칭인거죠.
반대로 이렇게 그 결정자에 의해 결정되어 지는 애는 종속자라고 합니다.
그리고 그 종속자는 그 결정자의 종속관계에 있다고 해요.
말그대로 결정자에 속해서 이리저리 끌려다닌다는거겠죠?
이걸 좀 뽀대나게 말하면, 어떤 애트리뷰트 A가 다른 애트리뷰트 B의 결정자이면 B는 A에 함수적으로 종속한다고 말합니다.
자 공무원끼리는 공무원 이름 검색하면 전화번호랑 관련 정보를 다 확인할 수 있죠? 연락책 테이블에 대해 살펴봅시다.
물론 사번이 있을 꺼고, 사번이 정해지면 당연히 이름이 결정되겠죠? 하나의 사번에 두 개의 이름이 존재할리는 없으니까! 또 사번이 정해지면 내선전화번호나 핸드폰번호 모두 알아서 결정되는 값들이예요.
즉 '사번, 이름, 내선번호, 핸폰번호' 이 네개의 컬럼에서 사번은 결정자가 되는거고, 이름, 내선번호, 핸폰번호는 사번에 종속되어있다고 말할 수 있어요. 핸폰번호가 정해졌다고 내선번호가 정해지는건 아니잖아요?ㅎㅎ
결정자가 정해지면 종속관계에 있는 나머지가 정해지는거기 때문에 위 그림처럼 화살표로 관계를 표현할 수 있습니다.
우리가 앞에서 쭉 봤던 테이블의 종속 관계를 그려보면 위처럼 표현할 수 있을거예요.
그런데 성적은, 수강생번호만으로 결정되지 않고, 수강과목만으로도 결정되지 않아요.
수강생번호와 수강과목 두 가지가 합쳐져야만 결정될 수 있죠.
이렇게 복합애트리뷰트에 의해 종속되고 그 외 어떤 것에도 부분적으로 종속되지 않은 관계를 완전 함수적 종속성이라고 합니다.
그리고 복합애트리뷰트가 아니라 빨간색 화살표처럼 이렇게 부분부분 종속 관계가 있는걸 부분함수적 종속성이라고 해요.
위 테이블은 결국 두 개 덩어리의 부분함수적 종속성을 가지고 있는건데 이를 제거해주는 게 제2정규화 인거예요!
쉽게 말하면 성명 전화번호는 수강생번호에 의해 결정되니 이 관련 테이블로 하나 빼고, (현재 상태에선, 성명, 전화번호등의 컬럼은 후보키 {수강생번호, 수강과목}의 일부인 수강생번호만 참조함.)
수강과목 담당선생님 또한 별개 테이블로 구성하는게 좋다.
이런 지침사항이 제2정규형인거죠. 용어를 사용하고 논리적으로 그려봤을 뿐 같은 얘기랍니다.
제 1정규형 테이블이 제 2정규형을 충족시키는 필요충분조건: 후보 키 K와 K에 속하지 않는 속성 A가 있을 때 A를 결정하기 위해 K의 일부가 아닌 K 전체를 참조해야만 하는 경우 1NF 테이블은 2NF이다.
이제 이해돼죠? 전체를 참조하지 않고 부분부분 참조해서 그에 영향받을 경우 2NF가 아니라는 얘깁니다.
애초에 전제조건이 완전함수적 종속성이 되려면 복합키여야 하기 때문에
1NF를 만족한 테이블 기본키가 단일키이면 2NF는 자동으로 성립돼요.
제2정규화 결과 테이블
자 위에 문제가 되던 테이블을 2NF를 수행하여 이처럼 바꿨습니다~~!
이제 핸드폰번호를 바꾸려면 첫 번째 테이블만 변경해주면 되고.
상담만 한 학생정보를 추가하고 싶으면 첫 번째 테이블에 삽입만 해주면 돼용. 공간이 낭비되지도 않죠!
그러면 제2정규화를 하고 나면 이상현상들이 다 사라질까? 근데 또 그렇지는 않습니다.
그랬으면 제3정규화가 있지 않았겠죠 ㅎㅎ 그 뒷 내용부터는 다음 포스팅에서 알아보도록 합시다.
오늘 포스팅은 여기까지입니다. 고생하셨어요. 도움이 되셨다면 공감은 어떤가요~!? 정보공유에 큰 동기부여가 된답니다 핳. 고럼 다음 포스팅에서 뵐게요.~~!
▼제3정규형 이어서 보기: jhnyang.tistory.com/360
[데이터베이스 정규화] 제 3정규형(3NF)와 이행적 종속성에 대해 살펴보자
[데이터베이스 DBMS 완전정복 목차] 안녕하세요 블로거 양햄찌입니다~! 최근에 쭉 정규화에 대한 포스팅을 진행중인데요, 저번에 알아봤던 제1정규형(1NF) 제2정규형(2NF)에 이어서 오늘의 주제는
jhnyang.tistory.com
'별걸다하는 IT > 데이터베이스 Database' 카테고리의 다른 글
[디비 SQL 오라클] SQL에도 IF분기문이 있다? CASE WHEN THEN 문법 알아보기, CASE구문 사용법 (0) | 2020.12.12 |
---|---|
[데이터베이스 정규화] 제 3정규형(3NF)와 이행적 종속성에 대해 살펴보자 (9) | 2020.12.03 |
[데이터베이스 DBMS] 정규화에 대해서 알아보자~! 정규화를 해야하는 이유와 필요성, 제1정규화에 대해서 (1) | 2020.11.30 |
[SQL] ROLLUP과 GROUP BY. 집계 통계에 사용되는 롤업 함수 사용법을 알아보자 (0) | 2020.11.24 |
[DMBS 무료 툴 소개] DBeaver 다운로드 및 설치. 디비버 오라클과 연동해 실행해보기 (2) | 2020.11.17 |
최신 댓글