오래 못 할 짓 하지 않기

[ 데이터베이스 ] 23. DB 정규화 (2) 본문

3학년 1학기/데이터베이스(DB)

[ 데이터베이스 ] 23. DB 정규화 (2)

쫑알bot 2024. 2. 14. 12:45
728x90

저번 시간...

 

 

2NF를 만족시키기 위해

모든 Non-prime attribute가

모든 Key에 대해 Fully functionally dependent 하도록 만들었다.

 

3NF

 

이제 card_id 에 대해서는 정규화를 했다.

- card_id의 문제점은 한 튜플에서 한 Attribute에 두 개의 값이 들어갔다는 것이다.

 

> 이번에는 empl_name을 보자. 중복되는 이름이 많다.

 

현재 테이블에 관한 Functional Dependency를 보면 아래와 같다.

 

이 때, empl_name은 empl_id에 따라 값이 바뀌는 걸 알 수 있다. 

즉, empl_id가 empl_name을 unique하게 결정한다.

      = {empl_id} → {empl_name}

 

또한 empl_id는 account_id에 따라 값이 unique 하다.

       = {account_id} → {empl_id}

 

이러한 점으로 보았을 때 empl_id 가 두 개 사이에 있으므로 

{account_id} → {empl_id} → {empl_name}

= {account_id} → {empl_name} 가 된다. 

 

... {bank_name , account_num} 도 account_id 처럼 하는 역할이 같다.

 

이런 결과로 만들어지는 functional dependency를

Transitive FD라고 한다.

 

만약 X → Y 이고, Y → Z 이면,  X → Z이고 이것은 'Transitive FD'이다.

(Y나 Z가 어느 키에 대해 subset이 아니어야 한다)

 

3NF의 조건 : 모든 non-prime attribute는 어떤 key에도 transitively dependent하면 안 된다.

                = non-prime attribute 끼리 서로 FD 관계이면 안 된다

                ㄴ위 예시에서는 empl_id랑 empl_name도 non-prime attribute인데, 얘 둘이서 FD관계라서 X

 

그렇다면 non-prime attribute 중에서 선택하는 쪽만 남기고, 선택 당하는 쪽을 삭제한 뒤에

다른 table로 그 두 개를 Primary key와 attribute 관계로 나눈다.

 

 

 


BCNF

 

class가 bank_name를 Functionally 하게 선택하므로

bank_name의 중복으로 인한 낭비를 줄일 수 있다.

 

BCNF : 모든 유효한 non-trivial FD X → YX가 super key여야 한다.

* super key = tuple을 unique하게 구별할 수 있는 key

* trivial = 바로 알 수 있는 것이 아닌  통해서 알 수 있는 것

뤼튼 답

 

 

하지만 이 상황에서 class는 튜플을 unique하게 구별할 수가 없다.

현재 테이블은 Class → bank_name 관계때문에 BCNF를 위반했기 때문에

새로 테이블을 나누어준다.

 

 

class와 bank_name은 고정되어 있기 때문에 다음과 같이 테이블을 만들어준 뒤

Employee_Account 테이블에 있는 bank_name은 삭제한다.

 

대신 Class attribute는 남겨두어야 한다. ACCOUNT_CLASS와 Join을 할 경우에 class name이 매개체가 되기 때문에

 

 

 

완성본

 


 

 

 

예시)

 

primary key = { team , back_number }

 

team_name은 back_number와는 관련있지 않다. / team과 관련있음.

 

key중에 하나인 back_number와는 관련이 없고, team과만 관련있으니

full dependent가 아니다.

 

다시 돌아가서  [  2NF는 key가 composite key가 아니면, 2NF는 자동적으로 만족  ]

은 보통은 맞다. 하지만 항상 그렇지 않다.

 

왜냐면 위 예시처럼 composite key일 땐 둘 중에 하나가 unique하게 식별하는 경우가 있지만

단일 key라면 무조건 unique하기 때문에 partially dependent 일 경우가 없다. 

 

 

항상 동일한 값을 갖는 Attribute는 primary 에 partially  dependent 이다.

 

 

 

이래야 2NF 만족

 

 


무조건 정규화를 해야하는 게 아니다.

[ 과도한 Join ] 과  [ 중복 데이터 최소화 ] 사이에서 잘 선택을 해야한다.

 

종종 역정규화 ( denormalization ) 을 할 때도 있다. 

 

 

(출처)

유튜브 쉬운코드