참고) 데이터베이스 첫걸음, 기무라 메이지


정규형

칼럼을 정할 때 이상이 생기지 않도록 만드는 규칙

 

정규화

정규형을 만족하도록 릴레이션을 분해해나가는 것

 

아노말리

-삭제이상
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?갱신이상이 여전히 존재하므로(참고로, 몇 정규화를 하면 무슨 이상은 완벽히 없어지고, 그런 경우는 없다. 단계가 높아질수록 이상이 생길 확률이 줄어드는 것 뿐이다). 아래를 보자.

 

제2를 만족하는 릴레이션에 업계코드,업계명을 추가

 

거래가 발생하지 않으면 기업의 업계코드와 업계명을 추가하고 싶어도 추가할 수 없다.

(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

+ Recent posts