참고) 데이터베이스 첫걸음, 기무라 메이지
정규형
칼럼을 정할 때 이상이 생기지 않도록 만드는 규칙
정규화
정규형을 만족하도록 릴레이션을 분해해나가는 것
아노말리
-삭제이상
200번학생이‘C123’ 과목을등록취소..200번학생의학년정보소실
-삽입이상
600번학생이2학년정보(투플)을삽입..불필요한정보(임시과목번호)를채워줘야함
-갱신이상
400번학생의학년을4->3로변경..4개의투플을모두갱신해야함
함수 종속
릴레이션이 변경되도 계속 지켜져야하는 의미적 관계(한 순간의 값으로 판단ㄴㄴ)
x(결정자)->y(종속자)
제1정규형: 하나의 셸에 복합적인 값을 포함하지 않는다
why? x에는 y가 대응하는 함수관계이기 때문에 기본키가 모든 열의 값을 하나로 특정할 수 있어야한다.
(1)처럼 칼럼을 추가->릴레이션 정의 변동이 많이 일어나서 성능 저하가 심함.
(2)->딩동댕
제2정규형: 제1을 만족하고, 기본키의 일부에만 종속하는 열이 없어야 한다 (==부분종속이 없어야한다)(기본키가 열이 하나라면 자동적으로 만족)
why? 아래를 먼저 보자.
-기본키
cb,cb,cb가 중복되므로 [기업ID]만으론 기본키가 될 수 없다. 즉, [기업ID+주문번호]이다.
기본키를 정할 떈 의미적으로 거르고, 값으로 걸러서 정해야한다.
-존재하는 함수종속
[기업ID+주문번호]->[접수일]
[기업ID+주문번호]->[기업명]
[기업ID+주문번호]->[기업규모]
[기업ID]->[기업명]
[기업ID]->[기업규모]
여기서, 기본키의 일부인 [기업ID]에 종속되는 종속자 [기업명],[기업규모]가 있다.
[기업명]과 [기업규모]열의 입장에서 보면, [주문번호]열음 쓸데없는 정보일 뿐이다.
[주문번호] 열의 입장에서 보면, [기업규모]를 알지 못하면 데이터를 삽입할 수 없는 삽입이상이 생긴다. null허용은 썩 좋은 방법은 아니다.
그러므로, 기업ID만으로 기업명과 기업규모를 결정짓는 릴레이션으로 분해한다.
제3정규형: 제2를 만족하고, 기본키를 제외한 열에서 이행종속이 존재하지 않는다.
이행종속
기본키가 [a]일때, [b]->[c]라는 종속관계가 있으면 기본키 정의때문에 [a]->[b]가 성립되고, [a]->[b]->[c]가 되므로
[c]는 기본키[a]에 이행종속이다.
why?갱신이상이 여전히 존재하므로(참고로, 몇 정규화를 하면 무슨 이상은 완벽히 없어지고, 그런 경우는 없다. 단계가 높아질수록 이상이 생길 확률이 줄어드는 것 뿐이다). 아래를 보자.
거래가 발생하지 않으면 기업의 업계코드와 업계명을 추가하고 싶어도 추가할 수 없다.
(ex거래한 업계는 석유,바이오와 했는데 업계종류를 화학도 추가하고 싶을떄..)
이런 경우, 업계코드와 업계명을 따로 빼서 분해한다.
주의 와 같은 경우는 이행종속이 아니다. 해당 종속관계의 종속자가 기본키이므로 제3정규형 정의와 관련없다.
BCNF: 릴레이션의 결정자가 모두 후보키여야만 한다
-존재하는 함수종속
[학번+과목]->[교수]
[교수]->[과목]
결정자는 [학번+과목],[교수] 총 두 가지가 존재한다.
[학번+과목]은 기본키이므로 후보키가 아니다.
[교수]는 키가 아니다. 그러므로 BCNF를 만족하지 않는다.
*제3을 만족하지 않는다고 실수할 수 있다. 교수와 과목은 이행종속이 아니다. 과목이 기본키이므로, 제3의 정의인 '기본키가 아닌 열이 기본키로부터 종속자'에 해당하지 않기 떄문이다.
정규화를 많이 하면 테이블 수가 늘어난다
->테이블 간의 관계성을 파악하기 힘들다
->ER다이어그램을 그린다.
정규화를 많이하면 테이블 수가 늘어난다
->조인을 할 확률이 높다
->성능이 낮아진다/대신, 아노말리는 적다
제5정규화까지 있지만 실무에선 제3정규화까지만 하면 된다
키의 종류와 관계
'Basic > Database' 카테고리의 다른 글
트랜잭션-동시성제어,회복 (0) | 2022.10.03 |
---|---|
트랜잭션 (0) | 2020.01.30 |
Issue: 오라클 노트북 두 개에 설치해서 db 공유 (IP의 이해) (0) | 2020.01.02 |
Index(인덱스) (0) | 2019.12.17 |
NoSQL (0) | 2019.12.10 |