241002 챌린지반 - 정규화와 비정규화

LIHA·2024년 10월 2일
0

내일배움캠프

목록 보기
68/108
post-thumbnail
post-custom-banner

제1정규화 - 한 칸에 다 쓰지좀 마!

제2정규화 - '부분 종속성' 제거로 중복을 처치

이렇게 되면 기본키가 여러개일 수도 있다.

player_id | player_name | equipped_item | item_type
1 | 호호아줌마 | 검 | 무기
1 | 호호아줌마 | 방패 | 방어구
1 | 호호아줌마 | 투구 | 방어구

복합 기본키에 일부에만 종속되는 비주요 속성이 있다면 '부분 종속성이 있다'고 표현한다.

-> 부분 종속성을 제거하고 각 속성이 완전히 기본 키 전체에 종속되도록 테이블을 분리해야 한다.

  • 그렇다면 어떻게 분리할까?
    -> 장비아이템과 타입만 따로 모아놓은 테이블을 새로 만들면 되지 않을까?

1 | 호호아줌마 | 검
1 | 호호아줌마 | 방패
1 | 호호아줌마 | 투구

검 | 무기
방패 | 방어구
투구 | 방어구

  • 제 2 정규화를 하면 대강 아래와 같은 식으로 테이블이 쪼개진다.

제3정규화 - '이행 종속성' 제거로 중복 데이터를 최고로 줄이기!

길드 이름을 통해서 길드장 이름까지 알게되는 것을 이행종속성이라고 한다.

  • 이행 종속성: 기본 키에 직접적으로 종속되지 않고, 다른 속성을 통해 간접적으로 종속되는 속성
    '왜 내 이름 하나로 길드 마스터까지 나오는걸까?' 라는 의문이 제 3 정규화의 내용.

player_id | guild_name | guild_master
1 | 전설 | 무야호
2 | 일편단심 | 우엉이
3 | 번개 | 마리
4 | 일편단심 | 우엉이

플레이어와 길드는 연관된게 맞는데, 길드 마스터는 왜 나오지? 그리고 길드 이름도 중복이 되네?
-> 플레이어 아이디와 길드 아이디만 연결시켜 놓고, 길드 테이블을 따로 만들어 놓는게 좋지 않을까?

정규화가 항상 좋은건 아니다 - 역정규화의 필요성

정규화는 테이블을 나누기 때문에 불필요한 JOIN 연산이 추가되어 오버헤드가 일어날 수도 있다.
이럴 때는 어느정도 트레이드오프로 역정규화를 해야 할 수도 있다.
최악의 경우 JSON.stringify로 저장하고 JSON.parse로 꺼내는 식인 경우도 있다.


과제 - BCNF에 대해 조사하기!

profile
갑자기 왜 춤춰?
post-custom-banner

0개의 댓글