DB(5) 정규화 데이터 베이스
세미나에서의 피드백이 나와 정규화 vs 비정규화(반정규화) 데이터 베이스에 대해서 정리하고자 한다,
오늘 세미나를 하며 느낀건, 말을 못한다는건 잘 모르기 때문이라는 생각이 들었다.
나의 잘못된 지식이 누군가에게 전달되어 그 사람에겐 그게 진실이 된다면, 안하니 못한 세미나가 될것이다.
조금더 내가 더 잘 이해하고, 당당하게 목소리를 낼수 있기를,, (그게 아니면 사기꾼이고,,,)
그러므로 오늘도 기록
0.목차
- 정규화란?
- 함수적 종속성
- 장단점
- 정규화 원칙
- 제1 정규화
- 제2 정규화
- 제3 정규화
- BCNF 정규화
1. 정규화란?
정규화란 테이블의 속성들이 상호 종속적인 관계 를 갖는 특성을 이용하여 테이블을 무손실 분해__하는 과정으로, 정규화의 목적은 __중복을 최소화 하도록 설계된 데이터 베이스를 말한다. 즉, 하나의 종속성이 하나의 릴레이션에 표현될 수 있도록 분해하는 과정 이라 보면 된다.
한 릴레이션안에서 여러 개체들의 속성이 혼합된다면 정보가 중복 저장될 위험이 크고, 저장 공간의 낭비로 이어진다. 또한 중복된 정보로 인해 ‘갱신이상’ 또한 발생하게 될것이다.
* 갱신이상
중복된 데이터 중 일부만 수정되어 데이터의 모순이 일어나는 현상
https://kosaf04pyh.tistory.com/294
이러한 문제를 해결위해 정규화 과정을 거치는 것이고, 정규화 과정을 통해 정규형을 만족하게 된다.
정규형
- 특정 조건을 만족하는 릴레이션의 스키마 형태
- 제1~5정규형 BCNF정규형이 존재한다.
- 차수가 높아질수록 만족시켜야 할 제약 조건이 늘어난다.
2. 함수적 종속성
함수적 종속성은 애트리뷰트(속성)들 사이의 관계에 대한 제약 조건으로 애트리뷰트 A가 B의 결정자이면, 다음의 조건을 따라야 한다.
A이면 B이고 동시에 A이면서 C일 수 없지만, B이면 A인것은 아니다.
예를 들어 아래 테이블에서 회원번호와 이름이 각각 10, 한승우
- 한승우 인 동명이인의 사원이 존재한다고 할떄, 사원번호를 속성 a, 이름을 b속성이라고 한다면, a이면 반드시 b이지만, b이면 반드시 a라고 할 수 없다라는 말을 이해할수 있을것이다. 따라서 B는 A를 __종속__하고 있다고 말한다.
3. 장단점
- 장점
- 데이터베이스 변경시 이상현상(Anomaly) 제거
- 저장 공간의 최소화 기능
- 효과적인 검색 알고리즘 생성가능
- 데이터 삽입시 릴레이션 재구성의 필요성 감소
- 데이터 구조의 안정성 및 무결성 유지
- 단점
- 릴레이션간의 Join 연산 증가
- 질의의 복잡도 증가
- 질의에 대한 응답시간 저하
- 릴레이션간의 Join 연산 증가
4. 정규화 원칙
- 정보의 무손실 표현
- 하나의 스키마를 다른 스키마로 변환할 때 정보의 손실이 있으면 안된다.
- 분리의 원칙
- 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리시켜 표현한다.
- 데이터의 중복성이 감소되어야 한다.
(옛날 외웠었던 도부이결다조,,,)
5. 제1 정규화
제1 정규화 (비정규형-> 1NF)
제1 정규형을 갖추려면 도메인 원자값 이라는 조건을 만족해야 한다.
도메인 원자값을 만족한다란
- 반복 그룹이 존재하면 안된다.
- TOM 이라는 학생에 대한 정보인 이름, 메일, 대학, 전공은 초기 설정값이다. 그렇기 떄문에 해당 정보는 수강 내역을 확인하기 위해서 계속 반복되고 있기 떄문에 분리가 필요하다.
- 모든 행은 식별자로 완전하게 구분되어야 한다.
- 과정
- 반복되는 부분을 체크한다. (학번(PK), 이름, 메일, 대학, 전공)
- 반복되는 부분과 그렇지 않은 부분을 분리한다. (pk 는 그대로 가져간다)
- 테이블을 나눈 후 반복되는 행은 삭제 한다.
그런데 위 학생 테이블은 도메인 원자값 조건인 ‘모든 행은 식별자로 완전하게 구분된다’ 라는 조건을 만족시키지 못한다.
위 표의 수강내역은 pk 인 학번 만으로는 모든행이 구분되지 않는다. 그렇기 떄문에 추가적으로 key를 설정해 주어야 한다.
그래서 ‘수강 내역’ 테이블의 ‘학번+수강학기+과목명’을 복합하여 __식별자__로 만들어 해결하면 제1 정규화 과정이 마무리 된다.
6. 제2 정규화 - 부분함수 종속 제거
필요 충분 조건 : 후보키 k와 k에 속하지 않은 속성 a가 있을때 a를 결정하기 위해 k의 일부가 아닌 k전체를 참조할때 1NF 테이블은 2NF 이다.
즉 KEY가 아닌 값들은 모두 KEY에 종속되어야 한다는 말이다.
조건은 이러하다.
- KEY가 아닌 컬럼(속성)은 KEY컬럼에만 종속 되어야 한다.
- 1번 조건으로 인해 __복합키__일때 제2 정규형의 조건이 된다. (복합키가 아니라면 제3 정규형) 즉 key값에만 주목하면 된다.
위의 표를 다시 가져와 보자.
우리는 제1 정규화를 진행하였던 수강내역 테이블에서 __복합키__로 ‘학번’, ‘수강학기’, ‘과목명’ 으로 만들었다. 그러면 제2 정규형에 만족을 하려면 __복합키(학번, 수강학기, 과목명)__와 __나머지 컬럼(성적, 제한인원)__이 확실하게 종속이 되어야 한다는 것이다.
‘성적’ 의 경우 학번과 수강학기 과목명을 알아야 성적을 알수 있기에 복합키에 종속이 되지만, 제한 인원의 경우 학번과는 따로 관계 가 없다.
그렇기에 __제한인원__의 경우 다시한번 아래와 같이 분리가 가능하다.
7. 제3 정규화 -이행적 함수 종속 제거
필요충분조건 : 제2 정규형을 만족하고, 테이블 내의 모든 속성이 키에만 의존하며 다른 후보키에 의존하지 않는다.
- 모든 key가 아닌 컬럼은 key에 완전 종속된다.
- 모든 non-key컬럼은 key컬럼에만 종속되어야 한다.
위 학생 표를 보면 non-key컬럼인 대학과 전공 컬럼을 확인해보자
위 두개는 key가 아님에도 종속 관계가 성립된다.
대학의 경우 전공을 포함하기 때문이다.
정규화가 잘된 테이블은 갑-을 관계까지만 존재한다.
하지만 이 테이블의경우 갑(key:학번)- 을(non-key:대학) - 병(non-key:전공) 까지 존재하므로 이 관계를 또 한번 나눌수 있다.
대학정보 테이블의 경우 대학이 전공을 포함한다. 하지만 key는 테이블의 튜플을 구분해야한다. 그래서 튜플을 구분하기 위해서 __전공이 key__값이 되어야 한다.
대학 정보를 참조하기 위해서는 학생 테이블의 전공을 외래키로 설정하여 대학정보 테이블을 참조할 수 있게 해야 한다.
https://velog.io/@yaincoding/NoSQL-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EC%97%AD%EC%A0%95%EA%B7%9C%ED%99%94Denormalization https://mr-dan.tistory.com/10