지난 포스터에서 이야기했던 이상과 함수 종속성에 이어 마지막으로 정규화에 대해 이야기해보려고 합니다
이상을 치료하는 방법인 정규화는 치료 스케일에 따라 그 규약이 더욱 빡빡해 집니다
즉 정규화 숫자가 올라갈수록 더 어렵다는 이야기가 되겠습니다.
먼저 제 1 정규화(1NF)에 대해서 이야기해봅시다
제 1 정규화는 테이블에 있는 모든 속성의 레코드 값이 원자값을 가지고 있는 형태를 말합니다.
여기서 새로운 개념이 등장하네요 바로 원자값이란 개념이죠
여기서 말하는 원자값이란 쉽게 설명하자면 최소한으로 쪼갤 수 있는 데이터의 한계입니다.
예를들어 주민등록번호를 생각해보면 주민등록번호를 앞자리와 뒷자리로 나누어 저장 할 수도 있는 것입니다.
<주민등록번호> -> <주민번호 앞자리, 주민번호 뒷자리>
사실 원자값은 설계자가 원자값이 있다고 판단되면 설계자 입장에서는 원자값이 있는것입니다. 약간 애매한 해석의 여지를 담고 있는것이지요
예제 하나 더 보고 가보도록 합시다
어떤 헬스장에서 회원정보를 아래와 같은 테이블에 넣어 보관하고 있다고 해봅시다
이름 |
거주지 |
전화번호 |
철수 |
부산 |
010-1111-xxxx |
영희 |
서울 |
010-2222-xxxx |
그런데 여기서 철수 회원이 업무 때문에 전화번호가 하나 더 생겼습니다.
그러면 아래와 같은 테이블이 됩니다.
이름🔑 |
거주지 |
전화번호 |
철수 |
부산 |
010-1111-xxxx 010-1111-yyyy |
영희 |
서울 |
010-2222-xxxx |
이렇게 되면 똑똑한 개발자는 전화번호라는 하나의 속성에 두개의 값을 지니고 있는 것은 원자값을 가지고 있지 않다는 것을 알아차리게 될 것입니다.
따라서 개발자는 다음과 같이 테이블을 분리했습니다.
이름🔑 |
거주지 |
철수 |
부산 |
영희 |
서울 |
이름🗝️ |
전화번호 |
철수 |
010-1111-xxxx |
철수 |
010-1111-yyyy |
영희 |
010-2222-xxxx |
이렇게 반복되는 속성을 기준으로 기본키 속성과 함께 새로운 테이블을 만드는 것입니다.
(참고로 🗝️는 외래키입니다.)
다음은 제 2 정규화(2NF)입니다.
제 2 정규화는 제 1 정규화를 만족하면서 완전 함수 종속인 테이블이 되었을 때 제 2 정규화라고 합니다.
여기서 이전에 포스트에서 봤던 내용인 완전 함수 종속이 나오네요
잘 상기하면서 예제를 보도록 합시다.
주민번호 앞자리🔑 |
주민번호 뒷자리🔑 |
이름 |
생년월일 |
거주지 |
890903 |
1111111 |
철수 |
1989-09-03 |
부산 |
950406 |
2222222 |
영희 |
1995-04-06 |
서울 |
여기서 잘보면
생년월일은 굳이 앞자리 뒷자리 둘다 쓸 필요 없이 앞자리만으로 정보를 알아낼 수 있죠
이를 표현하면 다음과 같이 됩니다.
주민번호 앞자리*주민번호 뒷자리 -> 생년월일 --------- 완전함수종속 위반
주민번호 앞자리 -> 생년월일
즉 주민번호 앞자리 말고 생년월일 정보를 알아낼 수 있는 다른 최소 속성 조합은 존재하지 않기 때문에 주민번호 앞자리 -> 생년월일 이라는 정보를 바탕으로 다음과 같이 테이블을 분리합니다.
주민번호 앞자리🔑 |
주민번호 뒷자리🔑 |
이름 |
거주지 |
890903 |
1111111 |
철수 |
부산 |
950406 |
2222222 |
영희 |
서울 |
주민번호 앞자리🗝️ |
생년월일 |
890903 |
1989-09-03 |
950406 |
1995-04-06 |
제 3 정규화(3NF)는 제 2정규화를 만족하고 후보키가 아닌 속성들에서 이행 종속이 없는 테이블을 말합니다.
이번에도 이전에 포스트에서 봤던 내용인 이행 종속이 나오네요
잘 상기하면서 예제를 보도록 합시다.
학번🔑 |
이름 |
학과 |
학과건물 |
201149856 |
철수 |
컴퓨터공학 |
105 |
201549856 |
민희 |
기계공학 |
107 |
여기서 학과 건물은 학과와 연관이 있습니다 그리고 학과는 학번과 연결되어 있죠
학번-> 학과
학과-> 학과건물
이러한 이행종속은 다음과 같이 풀어줍니다.
학번🔑 |
이름 |
학과 |
201149856 |
철수 |
컴퓨터공학 |
201549856 |
민희 |
기계공학 |
학과🗝️ |
학과건물 |
컴퓨터공학 |
105 |
기계공학 |
107 |
마지막 BCNF는 제3정규화를 만족하고 모든 결정자는 후보키여야 합니다.
여기서 결정자란 테이블의 나머지 속성을 모두 결정할 수 있는 속성을 말합니다.
예를들어 학번을 알고 있으면 이름과 주소 성별을 알 수 있겠네요 그러면 학번이 결정자가 됩니다.
학번 -> (이름, 주소, 학년, 성별)
예를 들어보죠
학번🔑 |
과목🔑 |
교수 |
201149856 |
운영체제 |
오박사 |
201549856 |
신뢰성공학 |
브라운박사 |
위 테이블을 분석해보면 학번과 과목으로 교수를 결정할 수 있습니다. 그러나 교수가 한학기당 한 과목을 맡게되면 교수라는 속성으로 다시 과목을 결정할 수 있게 됩니다.
함수 종속 표현으로 표현하면 다음과 같이 되는거죠
학번,과목-> 교수
교수-> 과목
이렇게 되면 교수라는 속성은 현재 후보키가 아니기 때문에 BCNF를 만족하지 않게 되는군요
따라서 교수를 후보키로 하는 새로운 테이블을 만들어 줘야합니다.
학번🔑 |
교수 |
201149856 |
오박사 |
201549856 |
브라운박사 |
과목 |
교수🗝️ |
운영체제 |
오박사 |
신뢰성공학 |
브라운박사 |
이렇듯 정규화까지 알아봤습니다. 이러한 정규화는 데이터의 중복을 낮춰주지만 반대로 조인 연산 비용이 증가하여 지나친 정규화는 시스템에 큰 부담이 됩니다. 따라서 정규화를 사용할려면 데이터 안정성과 시스템 부하에 적절한 트레이드 오프를 잘 정해야합니다.
'IT개념' 카테고리의 다른 글
데이터베이스에서 트랜잭션은 무엇일까요? (0) | 2020.05.30 |
---|---|
ER(객체 관계)모델과 다이어그램이란 무엇일까요? (1) | 2020.05.29 |
알송달송한 데이터베이스 정규화의 뜻 쉽게 풀이하면?(이상 현상과 함수 종속성) (0) | 2020.05.23 |
WRITTEN BY