이렇게 되면 기본키가 여러개일 수도 있다.
player_id | player_name | equipped_item | item_type
1 | 호호아줌마 | 검 | 무기
1 | 호호아줌마 | 방패 | 방어구
1 | 호호아줌마 | 투구 | 방어구
복합 기본키에 일부에만 종속되는 비주요 속성이 있다면 '부분 종속성이 있다'고 표현한다.
-> 부분 종속성을 제거하고 각 속성이 완전히 기본 키 전체에 종속되도록 테이블을 분리해야 한다.
1 | 호호아줌마 | 검
1 | 호호아줌마 | 방패
1 | 호호아줌마 | 투구
검 | 무기
방패 | 방어구
투구 | 방어구
길드 이름을 통해서 길드장 이름까지 알게되는 것을 이행종속성이라고 한다.
player_id | guild_name | guild_master
1 | 전설 | 무야호
2 | 일편단심 | 우엉이
3 | 번개 | 마리
4 | 일편단심 | 우엉이
플레이어와 길드는 연관된게 맞는데, 길드 마스터는 왜 나오지? 그리고 길드 이름도 중복이 되네?
-> 플레이어 아이디와 길드 아이디만 연결시켜 놓고, 길드 테이블을 따로 만들어 놓는게 좋지 않을까?
정규화는 테이블을 나누기 때문에 불필요한 JOIN 연산이 추가되어 오버헤드가 일어날 수도 있다.
이럴 때는 어느정도 트레이드오프로 역정규화를 해야 할 수도 있다.
최악의 경우 JSON.stringify로 저장하고 JSON.parse로 꺼내는 식인 경우도 있다.