이전시간에 언급한 개념은 넘어가겠다. 추가로 설명해야할 부분만 함!
정규화는 무손실 분해(nonloss decomposition)되어야 한다. 즉, 분해 전 릴레이션으로 되돌릴 수 있어야한다. 분해로 인한 정보의 손실이 발생한다면, 정규화가 아니다.
릴레이션이 얼마나 정규화 됐는지 나타내는 표기법이다.
각 정규형마다 제약조건이 존재한다. 차수가 높아지면, 제약조건이 많아지고 엄격해지는 특징이 있음.
따라서 정규형의 차수가 높아질수록 귀찮지만, 데이터 중복이 줄어들어 바람직한 릴레이션의 표본에 가까워진다!
다만 항상 모든 일은 상충관계, 기회비용이 존재한다. 항상 상황에 알맞는 정규형을 사용하도록 하자
릴레이션의 모든 속성이 원자값만 가지면 된다. 참고로 1정규형을 만족하지 않으면, 릴레이션이 될 자격이 없다
=> 릴레이션 4가지 특성 중 속성의 원자성
이미 두번이나 짚고 넘어간 내용이라 생략하겠음!
이전시간에 설명한 부분함수종속을 제거하여 완전함수종속으로 만든다.
여기서는 새로운예시를 들겠음
예시 릴레이션
학생ID | 학생이름 | 수업 | 교수 | 학점 | 교수연구실 | 수업시간 | 학과 |
---|---|---|---|---|---|---|---|
1001 | 카리나 | 컴퓨터프로그래밍 | 김교수 | A | 연구실 1 | 월 9시 | 컴퓨터공학 |
1002 | 지젤 | 데이터베이스 | 박교수 | B | 연구실 2 | 화 10시 | 전자공학 |
1003 | 윈터 | 회로이론 | 이교수 | C | 연구실 3 | 수 11시 | 전자공학 |
1001 | 카리나 | 데이터베이스 | 박교수 | B | 연구실 2 | 화 10시 | 컴퓨터공학 |
1002 | 지젤 | 컴퓨터프로그래밍 | 김교수 | A | 연구실 1 | 월 9시 | 전자공학 |
위 릴레이션의 기본키는 학생ID + 수업
이다.
이때 교수를 알고싶으면 수업
만 알면 된다.(수업에 종속됨) 또한 이름을 알고싶다면 학생ID
만 알면 된다.
=> 완전함수종속이 아니다.
따라서 부분함수종속인 관계를 분해한 새로운 릴레이션을 형성한다.
학생 릴레이션
학생ID | 학생이름 | 학과 |
---|---|---|
1001 | 카리나 | 컴퓨터공학 |
1002 | 지젤 | 전자공학 |
1003 | 윈터 | 전자공학 |
수업 정보 릴레이션
수업 | 교수 | 교수연구실 |
---|---|---|
컴퓨터프로그래밍 | 김교수 | 연구실 1 |
데이터베이스 | 박교수 | 연구실 2 |
회로이론 | 이교수 | 연구실 3 |
성적 릴레이션
학생ID | 수업 | 학점 |
---|---|---|
1001 | 컴퓨터프로그래밍 | A |
1002 | 데이터베이스 | B |
1003 | 회로이론 | C |
1001 | 데이터베이스 | B |
1002 | 컴퓨터프로그래밍 | A |
와! 첫 예시에서 중복된 이름과 중복된 학과가 제거되었다. 또한 부분종속성을 제거하여 유지보수성이 용이하게 되었다.
예를들어 예시 릴레이션에서는 수업의 담당교수가 바뀌면, 일일히 찾아야하는 번거로움이 있다.
하지만 2정규화가 끝난 릴레이션에서는 수업 정보 릴레이션의 교수 이름만 변경하면 된다.
2정규형에서는 부분 함수 종속성을 제거하였다. 그러면 감이 살짝 오지 않는감?
이행 함수 종속성또한 없애야 할 골칫거리다!
현재 수업정보 릴레이션을 살펴보자
수업 | 교수 | 교수연구실 |
---|---|---|
컴퓨터프로그래밍 | 김교수 | 연구실 1 |
데이터베이스 | 박교수 | 연구실 2 |
회로이론 | 이교수 | 연구실 3 |
교수연구실
은 교수
에 의존하고 교수
는 수업
에 의존한다.
즉, 교수연구실
이 간접적으로 수업
에 의존한다.
따라서 릴레이션을 분리할 필요가 있다.
수업정보 릴레이션
수업 | 교수 |
---|---|
컴퓨터프로그래밍 | 김교수 |
데이터베이스 | 박교수 |
회로이론 | 이교수 |
교수 릴레이션
교수 | 교수연구실 |
---|---|
김교수 | 연구실 1 |
박교수 | 연구실 2 |
이교수 | 연구실 3 |
이렇게 이행 함수 종속성을 제거하여 제 3 정규형을 만족하게 되었다.
제4~제5정규형은 실무에서도 거의 사용하지 않으므로 패스한다.
정규화는 결국 확장가능성(삽입,갱신)과 중복제거(중복 데이터 제거)에 초점을 맞춘다.
이는 코딩의 기본 원리와 일맥상통하는 느낌이 있다. 중복 코드를 줄이고, 재사용 가능하게하며 확장성 있게 만든다. 하지만 너무 집착하면 문제가 생긴다. 제4~제5정규형의 경우도 속도가 느려 잘 사용하지 않는다고 한다. 코드 역시 그렇다. 시작부터 클린코드와 재사용가능성 등의 최적화을 염두하면 개발하는 속도가 느려진다. 항상 최적화와 속도의 사이에서 줄타기를 잘 해야한다!