본문 바로가기
카테고리 없음

2정규형(2NF)

by youngxdev 2023. 3. 3.

함수 종속성

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 디자인이 이뻐요

댓글