오래 못 할 짓 하지 않기
[ 데이터베이스 ] 23. DB 정규화 (2) 본문
저번 시간...
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 → Y는 X가 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 ) 을 할 때도 있다.
(출처)
유튜브 쉬운코드
'3학년 1학기 > 데이터베이스(DB)' 카테고리의 다른 글
[ DB ] 1. R - DBMS (0) | 2024.03.07 |
---|---|
[ 데이터베이스 ] 24. Index (0) | 2024.02.20 |
[ 데이터베이스 ] 22. DB 정규화 ( Normalization ) (0) | 2024.02.09 |
[ 데이터베이스 ] 21. Functional Dependency (FD : 함수 종속) (0) | 2024.02.08 |
[ 데이터베이스 ] 20. DB 테이블을 잘못 설계한다면? (0) | 2024.02.07 |