관계형 데이터베이스를 공부하는데 맞이하는 가장 첫번째 난벽은 개인적으로 정규화라고 생각합니다
보통 정규화에 앞서 배울 내용들 즉 릴레이션이나 스키마 구조, DBMS의 역활같은 거는 그냥 외우면 되는거니까요
그런데 이 정규화라는 녀석은 성격이 약간 다릅니다. 정규화는 철저한 논리식에 기반을 두고 있기 때문에 암기보다는 이해가 중요합니다. 이러한 이해를 바탕으로 여러가지 규칙을 칼같이 지키며 릴레이션을 정규화할 수 있습니다.
사실 정규화가 어려운 이유는 위의 것들 도 있겠지만 가장 큰 문제는 문제점이 뭔지를 찾는게 더욱 문제가 되겠네요
이건 뭐라 설명할 수 없고 그저 열심히 여러 문제나 모델링을 하면서 문제점을 보는 눈을 기르는 수밖에 없습니다.
먼저 배울건 데이터베이스를 막 설계하면 생기는 문제점과 그 문제점을 측정할 수 있는 도구를 알아봅니다
그리고 이 데이터 베이스의 수리 방법을 정규화라고 하는데 여기서는 보통 데이터베이스 정규화하면 배우는 1~3 정규화와 BCNF의 이해에 주력합니다 더욱 공부하고 싶으신 분들은 4~6정규화까지 찾아서 공부해보시면 좋을것같습니다.
먼저 정규화의 정의를 봅시다
정규화의 정의 : 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스
(위키백과 참조)
위 정의는 한눈에 봐서 이해하기에는 무리가 있군요
문장을 분해해봅시다
관계형 데이터베이스의 설계에서 중복을 최소화하게 -> 그러면 RDB에서 중복이 무엇인가라는 개념이 필요하겠죠?
데이터를 구조화하는 프로세스 -> 구조화가 무엇일까요?
저 문장을 분해해서 해석했더니 두 가지 의문이 나왔네요
"중복"의 개념과 "구조화"가 무엇인지에 대한 의문이죠
먼저 구조화를 설명하자면 여러 데이터가 모여서 테이블을 형성하고 그 테이블 들이 모여서 하나의 스키마를 구성하는게 관계형 데이터베이스에서 말하는 구조화 입니다.
데이터 중복이 데이터베이스 설계를 막장으로 하면 생기는 문제점인데 약간 복잡하니 예를 들어보죠
어떤 영화관에서 예약 고객을 받기 위해 데이터베이스 테이블을 아래와 같이 운영하고 있다고 합니다
고객번호🔑 |
영화이름🔑 |
티켓수 |
상영관 |
001 |
포레스트 검프 |
3 |
3관 |
004 |
쉰들러 리스트 |
2 |
2관 |
002 |
타이타닉 |
5 |
3관 |
006 |
트루먼 쇼 |
1 |
1관 |
001 |
쇼생크탈출 |
2 |
4관 |
004 |
반지의 제왕 |
1 |
2관 |
007 |
트루먼 쇼 |
4 |
4관 |
이 테이블은 SELECT 쿼리를 사용할 때는 문제가 없지만 이 테이블에 들어있는 속성이나 데이터 때문에 3가지 문제가 발생합니다 문제라기 보다는....이 문제는 마치 영어의 불규칙동사를 외우는 것과 같습니다! 쓸려면 예외를 외워야하고 실수가 빈번하게 일어나죠
먼저 3가지 이상에 대해 알아봅시다
삽입 이상- 새로운 영화 "기생충"이 4관에 상영 예약 데이터를 테이블에 추가해본다고 생각해봅시다
그러면 <NULL, 기생충, NULL, '4관'> 을 삽입해야하는데 고객번호가 기본키이기 때문에 데이터가 넣어지지 않습니다
신규 영화이름을 넣기 위해선 몰래 고객 아무나 한명을 예약에 넣어야되죠 이것을 삽입 이상이라고 합니다
갱신 이상 - "트루먼 쇼" 상영관을 1관에서 3관으로 변경하는 경우를 생각해봅시다
영화 위에는 튜플 2개만 변경하면서 오류가 발생했습니다 007 고객이 예약한 자료는 갱신이 안되버렸습니다
나중에 007 고객이 영화관에 와서 4번 상영관으로 가면 매우 뻘쭘해지겠군요
삭제 이상 - 고객번호가 001인 고객이 "포레스트 검프" 예약을 취소하였습니다 그런데 이를 어쩌죠 001 고객이 예약한 정보가 테이블 내에 "포레스트 검프" 정보를 가지고 있는 유일한 튜플이네요 그러면 저 튜플을 삭제하는 순간 테이블 내에선 다시 입력하기 전까지 "포레스트 검프"가 있는지도 모르겠군요
이러한 이상이 생기는 주원인은 데이터 중복 때문인데 데이터 중복을 낮추는 방법이 바로 정규화입니다
정규화에선 중복을 최소화하게 데이터를 구조화 한다고 하였습니다. 이를 위해서 테이블의 갯수나 테이블의 속성을 재설계하는 것이죠. 즉, 데이터의 중복을 낮추기 위해 테이블을 쪼개고 고치고 다시 만드는것 <구조화> 하는거죠
이제 1~3 정규화와 BCNF에 대해 본격적으로 들어가기 전에 한가지 중요한 개념이 있습니다. <함수 종속성> 이라는 개념인데 이 개념은 테이블이 주어졌을 때 어디가 이상한지 그 이상한 점을 찾는 논리적 도구입니다.
마치 의사가 내장 어떤 부분이 아픈지 판단하는 청진기로 봐도 무방합니다.
먼저 이 새로운 도구의 정의를 봅시다
함수 종속성 : 같은 테이블 안의 속성 간에 특정 속성 값이 함수적으로 다른 속성 값을 결정하는 종속관계
이번에도 상당히 복잡한 개념입니다 한번에 이해가 잘 안되는게 당연한 현상이죠
이거는 저 말뜻을 이해하는 것보다는 예를 통해 한번 보는게 훨씬 쉽습니다
회사의 사원들의 정보를 관리하는 테이블을 다음과 같이 만들었습니다.
사원번호🔑 |
주민등록번호🔑 |
이름 |
거주지 |
001 |
111111-111111 |
김길동 |
서울 |
002 |
111111-111112 |
마이클 |
서울 |
003 |
111111-111113 |
도우너 |
깐따삐야 |
여기서 사원번호가 주어지면 주민등록번호를 알 수 있겠죠?
그러면 함수 종속성으로 이렇게 쓸 수 있습니다.
사원번호 ->주민등록번호
이렇게도 쓰는게 가능합니다
사원번호*거주지 ->주민등록번호*거주지
그런데 주민등록번호로 이름을 알 수 있네요 물론 사원번호로도 알 수 있죠 이것을 이렇게 적는게 가능합니다
주민등록번호->이름
사원번호->이름
이렇게 특정 속성 값으로부터 다른 속성값을 결정 하는 관계를 함수 종속성이라 합니다
논리적으로 생각해서 이 속성은 이 속성을 결정할 수 있다!!!라고 생각하면 그렇게 해석해도 됩니다. 단 자기만 옳다고 생각 되는게 아니라 사회 전반적으로 생각이 인정받아야겠지만요... 이러한 특성 때문에 함수 종속성은 여러 표현이 나올 수 있습니다. 그 표현들을 알아보죠
1. x->y and x->z then x->yz
ex) 사원번호->이름 and 사원번호->거주지 then 사원번호 -> 이름*거주지
2. x->yz then x->y and x->z
ex) 사원번호 -> 이름* 거주지 then 사원번호->이름 and 사원번호->거주지
3. x->y and wy->z then wx->z
ex) 여기서는 조금 다른 속성을 끌어쓰겠습니다
출생일->주민번호앞자리 and 주민번호앞자리*주민번호뒷자리->이름 then 출생일*주민번호뒷자리->이름
4. x->y and z->w then xz->yw
ex) 사원번호->이름 and 주민등록번호->거주지 then 사원번호*주민등록번호->이름*거주지
여기서 완전 함수 종속성과 부분 함수 종속이라는 개념이 나오는데 각각의 개념은 다음과 같습니다.
완전함수종속
: 테이블에서 속성 x가 다른 단일 혹은 복합 속성 y에 함수적 종속이면서 다른 어떤 속성과도 함수적 종속이 아닌 것
예를 들어 x1*x2*x3.... -> y을 보면 쉽게 알 수 있습니다.
위에서 예를 들면 다음과 같은 스키마가 있다고 합시다
수강 스키마
<학번, 과목번호, 학점, 성별, 강의교수>
이때 학점은 과목번호만으로 정해지지 않고 학번만으로 정해지지 않습니다.
오직 학번과 과목번호의 속성의 조합으로만 알 수 있습니다.
학번*과목번호->학점
부분함수종속
위쪽 테이블을 다시 가져와보죠
사원번호🔑 |
주민등록번호🔑 |
이름 |
거주지 |
001 |
111111-111111 |
김길동 |
서울 |
002 |
111111-111112 |
마이클 |
서울 |
003 |
111111-111113 |
도우너 |
깐따삐야 |
여기서 거주지는 주민등록번호로도 알 수 있는 속성입니다.
이때 사원번호와 거주지의 관계를 부분함수종속이라고 합니다.
이행 함수 종속
이행함수종속이란 x->y이고 y->z이면 x->z인 속성을 말합니다.
예를 들어 다음과 같이 학생 스키마가 있다고 합니다.
학생
<학번, 이름, 학과, 학과건물>
이때 좀 억지긴 하지만 학번으로는 학과건물을 알아낼 수 없다고 합시다!!
학과건물은 오직 학과에 의해서만 알아낼 수 있는거죠
그러면 학번-> 학과 이고 학과->학과건물 이면 학번->학과건물 이라는 논리를 이끌어 낼 수 있습니다.
이것을 이행종속이라고 합니다.
이렇듯 함수적 종속을 통해 현재 테이블의 속성관계를 표현할 수 있게 되었습니다.
지금까지 그냥 데이터베이스를 막 설계하면 생기는 문제점과 그 문제점을 측정할 수 있는 도구를 얻었습니다.
그러면 마지막으로 수술 방법은 알아야하는데 문서가 너무 길어져서 정규화에 대한 이야기는 다음으로 미루도록 하겠습니다.
'IT개념' 카테고리의 다른 글
데이터베이스에서 트랜잭션은 무엇일까요? (0) | 2020.05.30 |
---|---|
ER(객체 관계)모델과 다이어그램이란 무엇일까요? (1) | 2020.05.29 |
알송달송한 데이터베이스 정규화의 뜻 쉽게 풀이하면?(1~3정규화와 BCNF) (0) | 2020.05.24 |
WRITTEN BY