[데이터베이스 모델링] 정규화(2NF,3NF)

2025. 11. 14. 18:32·데이터 분석/06. 데이터 모델링

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 해결 방법

  • 유저 테이블이 없는 경우
    1. 유저 테이블 생성 : id,name,age를 attribute로 가지게 생성
    2. event table에는 유저 로우를 찾을 수 있는 foregin key를 추가

 

  • 유저 테이블이 있는 경우
    1. winner를 name으로 바꿔주고 user테이블에 name과 age 컬럼을 옮기기
    2. 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
'데이터 분석/06. 데이터 모델링' 카테고리의 다른 글
  • [데이터베이스 모델링] Candidate Key
  • [데이터베이스 모델링] 함수 종속성과 이행성
  • [데이터베이스 모델링] 정규화
  • 카디널리티를 적용한 ERM 초안 수정
Growth DA Log
Growth DA Log
Growth DA Log 님의 블로그 입니다.
  • Growth DA Log
    Growth DA Log님의 블로그
    Growth DA Log
  • 전체
    오늘
    어제
    • 분류 전체보기 (125)
      • TIS_COMPANY (6)
      • 코딩 테스트 (61)
        • 01. Python (3)
        • 02. SQL (58)
      • 데이터 분석 (53)
        • 01. BigQuery (9)
        • 02. GA4 (1)
        • 02-1. GA4를 더 잘 다루기 위한 마케팅 개.. (5)
        • 03. streamlit (5)
        • 04. Git (12)
        • 05. 데이터 엔지니어링 (3)
        • 06. 데이터 모델링 (11)
        • 07. Excel (0)
        • 08. Tableau (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    쿼리테스트
    이행성
    프로그래머스
    solvesql
    DENSE_RANK
    tableau
    cross_join
    revert
    SQL
    rank
    코딩테스트
    streamlit
    윈도우함수
    tableaubootcamp
    AARRR
    ROW_NUMBER
    코테
    코드잇스프린트후기
    git
    Reset
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Growth DA Log
[데이터베이스 모델링] 정규화(2NF,3NF)
상단으로

티스토리툴바