그 전에 아래의 용어들을 짚고 넘어 가자.
1. super key : table에서 tuple들을 unique하게 식별할 수 있는 attribute set
2. (candidata) key : super key 중에서 어느 한 attribute라도 제거하면 tuple들을 unique하게 식별 못하는 super key.
3. primary key : (candidata) key 중에서 실제로 tuple을 unique하게 식별하기 위한 선택한 (candidta) key.
4. prime key : 임의의 key에 속하는 attribute.
5. non-prime key : 어떤 (candidate) key에도 속하지 않는 attribute.
EMPLOYEE_ACCOUNT에 존재하는 모든 FD를 아래에서 보여 주고 있다.
국민은행 계좌의 등급과 우리은행 계좌의 등급은 서로 겹치지 않기 때문에 계좌의 등급으로 은행 이름(bank_name)을 결정할 수가 있다.
1Normal Form(1NF)
(참고로, 정규화는 TABLE의 Schema만을 보고 만들어 나가는 것인데, 여기서는 이해를 쉽게 하기 위하여 임의의 tuple들을 입력하여서 설명을 하였다.)
위와 같은 TABLE이 있다고 하자. 4행의 card_id는 2개의 value를 가지고 있다.
그리고 primary key는 account_id라는 것에 주의하자.
card_id는 c201, c202로 단일값으로 분리돼 저장이 되어야 한다.
1Normal Form의 조건을 만족시키기 위해, 아래와 같이 table을 수정을 하였다.
table을 위와 같이 고치므로, 1NF를 만족하게 되었다.
card_id를 단일값으로 바꾸는 과정에서 3가지의 issue가 생겼다.
1. 중복된 데이터 발생
-> 기존에는 account_id를 primary key로 하여 tuple을 unique하게 식별이 가능하였다.
그러나 2개의 card_id를 가지는 tuple을 2개의 tuple로 분할하기 위하여, 해당 tuple의 card_id를 제외한 primary key를 포함
한 모든 atttribute를 그대로 복사를 하여 새로운 위와 같이 새로운 tuple을 만들었다.
이 경우, account_id만으로는 더이상 tuple을 unique하게 식별하지 못하게 되었다.(account_id=a21은 2개의 tuple식별)
그럼 primary key은 어떤 것으로 선택해야 하나??
account_id는 2개 이상의 tuple을 식별하게 되었다.
그러나 그 식별된 tuple들의 card_id만큼은 서로 다를 것이다.
고로, primary key : {account_id} -> {account_id , card_id}로 primary key가 변경이 되면 된다.
2. ratio의 합이 1이 아닌 tuple의 pair가 발생
3. (candidate) key에 변경이 생겨서, primary key도 변경을 해줘야 한다.
2Normal Form(2NF)
1NF의 조건을 만족시키기 위해 TABLE을 변형하는 과정에서 (candidate) key에 card_id가 각각 추가됨.
위 그림에 적힌 2NF의 정의에 의해, 모든 (candidate) key, 즉 {bank_name, account_id, card_id},{account_id,card_id}에
대해 non-prime atttribute는 full dependency 관계여야 한다.
위 조건을 만족시키기 위하여 (candidate) key에서 card_id를 빼주고 아래와 같이 card_id를 다른 테이블을 생성하여 분할
해주었다.
EMPLOYEE_ACCOUNT TABLE의 (candidate) key = {bank_name,account_num} , {account_id}는 모든 non prime key에
대해 full dependency 관계에 있다.
ACCOUNT_CARD에 account_id attribute를 foreign key로서 넣었다.(나중에 EMPLOYEE_ACCOUNT와의 JOIN을 위해)
분할 후, EMPLOYEE_ACCOUNT 테이블의 중복되어 있는 TUPLE을 삭제해주면 된다.
1. primary key인 account_id와 모든 non prime key는 full dependency관계!
2. primary key인 {bank_name, account_num}과 모든 non prime key는 full dependency 관계!
위의 1,2에 의해서 EMPLOYEE_ACCOUNT Table은 2NF를 만족하게 되었다.
(ACCOUNT_CARD도 2NF를 만족)
'CS 과목(CS科目) > 데이터 베이스(データベース)' 카테고리의 다른 글
25. DB INDEX (0) | 2022.12.16 |
---|---|
24. DB 정규화(normalization) - Part 2 (0) | 2022.12.16 |
22.함수 종속(Functional Dependency) (0) | 2022.12.16 |
21.DB 테이블 설계를 잘못하면 생길 수 있는 문제 (0) | 2022.12.16 |
20. MVCC - Part 2 (0) | 2022.12.16 |