함수 종속성
id | 주민번호 | 이름 | 성별 |
1 | 890101-1xxxxxx | 홍길동 | 남 |
2 | 930101-2xxxxxx | 홍길순 | 여 |
2정규형을 알려면 함수 종속성의 개념을 알아야합니다. 위 테이블을 보면 주민번호는 이름과 성별을 결정합니다. 즉 주민번호를 알면 이름과 성별을 알 수 있죠. 이런 것을 좀 어렵게 표현하면 이름과 성별은 주민번호에 종속된다. 라고 합니다. 주민번호만 알면 특정 로우를 결정지을 수 있어요. 이것을 함수 종속성이라고 합니다.
반대의 경우는 어떨까요? 이름을 안다고 주민번호를 알 순 없습니다. 위 테이블에서는 표현하진 않았지만 동명이인이 있을 수 있기 때문이에요. 이런 컬럼들은 특정 로우를 결정지을 수 없습니다. 이름을 안다고 몇 번째 로우인지 알 수없는 것이죠.
2정규형(2NF)
정규형의 기준은 다음과 같습니다.
- 1정규형에 부합해야한다.
- 로우를 결정 지을 수 없으면서 동시에 로우를 결정 지을 수 있는 컬럼에 일부만 함수 종속성이 있는 컬럼이 없어야한다.
그냥 그림으로 볼게요 ..
id | 유저_id | 상품_id | 성별 | 나이 | 리뷰 코멘트 |
1 | 1 | 1 | 남 | 30 | 튼튼해요 |
2 | 2 | 2 | 여 | 30 | 디자인이 이뻐요 |
위 리뷰 테이블을 보면은, [유저_id와 상품_id] 두 컬럼을 합쳐서 특정 로우를 결정 지을 수 있습니다.id값도 마찬가지입니다.이렇게 id, [유저_id, 상품_id]처럼 특정 로우를 결정 지을 수 있는 키를 candidate key라고 합니다. 반면 성별 나이, 리뷰 코멘트는 특정 로우를 결정할 수 없습니다. 이런 키를 non-prime attribute라고 합니다.
non-prime attribute 3개 중에서 리뷰 코멘트는 로우를 특정 짓는 [유저_id, 상품_id]에 함수 종속성이 있습니다. 하지만, 성별이나 나이는 [유저_id, 상품_id] 묶음이 아닌 유저_id에만 함수 종속성이 있죠. 즉, 이런 컬럼이 있으면 2정규형에 부합하지 않는 것입니다.
2정규화가 적용된 경우,
테이블만 분리해주면 됩니다.
먼저 유저 테이블
id | 유저 | 성별 | 나이 |
1 | 홍길동 | 남자 | 30 |
2 | 홍길순 | 여자 | 30 |
그 다음엔 상품 테이블
id | 이름 |
1 | 금도끼 |
2 | 은도끼 |
마지막으로 리뷰 테이블
id | 유저_id | 상품_id | 리뷰 코멘트 |
1 | 1 | 1 | 튼튼해요 |
2 | 2 | 2 | 디자인이 이뻐요 |
댓글