1. 2NF (제 2 정규형)
앞서 제 1 정규화를 할 때 언급했었지만 테이블이 2NF에 부합하기 위해서는 우선 1NF에 부합해야합니다.
제 1 정규화는 테이블 안 모든 값이 나누 수 없는 단일 값이어야 한다는 것이었죠?
제 2 정규화는 테이블에 Candidate key의 일부분에 대해서만 함수 종속성이 있는
non-primary attribute가 없어야한다는 것입니다.
구체적인 예시를 통해서 완벽하게 이해해봅시다
다음 테이블은 제 2정규형을 지키고 있지 않은 테이블입니다
| id | user_id | product_id | age | price | score | comment |
| 1 | 1 | 101 | 25 | 12000 | 5 | "좋아요" |
| 2 | 1 | 102 | 25 | 15000 | 4 | "무난해요" |
| 3 | 2 | 101 | 31 | 12000 | 3 | "별로예요" |
| 4 | 2 | 103 | 31 | 18000 | 5 | "최고!" |
이 테이블에서 candidate key는 {id},{user_id, product_id} 입니다
non-primary attribute로는 age와 price가 되겠습니다
여기서 age는 user_id에 대해 함수 종속성을 가지고 있고
price는 product_id에 대해 함수 종속성을 가지고 있죠
그렇기 때문에 {user_id, product_id} 집합 전체에 대해서 age와 price는 함수 종속성이 있지 않습니다
정확히 따지면 각각 컬럼에 대해 부분적인 함수 종속성을 가지고 있는 것이죠
이게 바로 후보키의 일부분에 대해서만 함수 종속성이 있는 non-primary key가 없어야한다는 것입니다
2. 2NF 해결 방법
후보키의 일부분에만 의존하는 non-primary attribute들을 따로 분리해주면 됩니다
여기선 기존에 review 테이블에 있던 age와 price attribute를
각각 user table과 product테이블에 옮겨주면 됩니다.
옮겨줄 테이블이 없다면 새로운 테이블을 만들어서 거기에 저장해 주면 됩니다
3. 3NF (제 3 정규형)
앞서 제 2 정규형와 같이 제 3 정규형에 부합하기 위해서는 우선 제 2 정규형에 부합해야합니다
그리고 테이블 안에 있는 모든 attribute들은 오직 primary key에 대해서만 함수 종속성이 있어야 합니다
(즉, 테이블의 모든 attribute는 직접적으로 테이블 Entity에 대한 내용이어야만 한다는 것이죠)
다음 테이블은 제 3 정규형을 어긴 테이블입니다
| id | event | event_num | winner | age |
| 1 | 새해 기념 이벤트 | 001 | 남예준 | 28 |
| 2 | 새해 기념 이벤트 | 002 | 이영희 | 31 |
| 3 | 봄맞이 할인 이벤트 | 001 | 박민수 | 23 |
| 4 | 여름 축제 이벤트 | 001 | 유하민 | 25 |
candidate key = {id}, {event, event_num}
non-prime attribute = winner, age
여기서 age는 winner에 대한 정보이기 때문에 제 2 정규형을 지키고 있습니다
제 3 정규형에 부합하기 위해서는 모든 attribute들이 직접적으로 primary key에 대해서만! 함수 종속성이있어야한다고 했죠
지금같은 경우는 당첨 정보에 대한 내용이어야한다는 거죠
하지만 age는 winner에 대한 함수 종속성이 있고 winner는 id에 대한 함수 종속성이 있어서
이행적 함수 종속성이 있다고 할 수 있습니다
제 3 정규형에서는 이런 이행적 함수 종속성도 있으면 안됩니다!
4. 3NF 해결 방법
- 유저 테이블이 없는 경우
- 유저 테이블 생성 : id,name,age를 attribute로 가지게 생성
- event table에는 유저 로우를 찾을 수 있는 foregin key를 추가
- 유저 테이블이 있는 경우
- winner를 name으로 바꿔주고 user테이블에 name과 age 컬럼을 옮기기
- event table에서유저 로우를 찾을 수 있는 foregin key 추가
'데이터 분석 > 06. 데이터 모델링' 카테고리의 다른 글
| [데이터베이스 모델링] Candidate Key (0) | 2025.11.14 |
|---|---|
| [데이터베이스 모델링] 함수 종속성과 이행성 (0) | 2025.11.14 |
| [데이터베이스 모델링] 정규화 (0) | 2025.11.14 |
| 카디널리티를 적용한 ERM 초안 수정 (0) | 2025.09.29 |
| 카디널리티 관계 유형 (0) | 2025.09.29 |
