이번엔 정규화에 대해 배워보자.
정규화는 1정규형부터 5정규형까지 있는데, 굳이 외울 필욘 없고, 저절로 따라하게 될 것이다.
정규화를 하는 이유는 테이블을 올바르게 변경하고 분할하기 위해서다.
해당 게임 데이터베이스를 살펴보자. 다 좋은데, inventory에 다량의 아이템이 들어간 걸 볼 수가 있다. 초록 물약을 하나 쓴다면 해당 인벤토리는 string 형태이므로 일일이 뒤져가면서 갯수를 감소해야 하니, 영 비효율적이다. 그렇기에 이와 같이 바꿔보자.
인벤토리 내 아이템을 새로운 행으로 분할하여 만들었다. 더 이상 문자열을 통해 힘들게 접근할 필요가 없다!
그러나 여전히 문제가 있는데, ID부터 Level까지, 너무나도 많은 열이 중복된 모습을 볼 수 있다. 딱봐도 매우 비효율적이고, 만약에 rookiss 이름을 변경한다면 저 많은 행들을 전부 바꿔야 하니 얼마나 끔찍한가? 데이터베이스에선 중복은 끔찍한 재앙으로 여겨야 한다는 점.
어떻게 해결할 수 있을까?
ID를 Primary Key로 한다면, 아이템코드, 아이템이름, 아이템수를 기존 테이블에서 독립시키고, 이 테이블에다가 ID의 Foreign Key인 PlayerID를 추가하자. 확실히 깔끔해진 모습을 볼 수 있다! Foreign Key를 통해 Item 테이블에 접근할 수 있게 되니, 문제가 될 것도 없다.
여전히 문제가 있는데, PlayerID가 1001, 1005에서 양초의 행 또한 중첩되는 것이 보인다.
전 단계에 했던 것처럼, itemName을 독립시키고, ItemCode의 Foreign Key를 itemInfo에 추가해주면 해결된다. 더 이상 데이터가 중복된 행이 보이지 않고, 각 테이블 별로(플레이어, 인벤토리, 아이템 정보) 자신만의 역할을 수행하게 되니 정규화가 끝나게 된다.
결론은 데이터베이스에선 중복을 없애고 테이블을 나누는 것이 가장 중요하다는 말씀이다. 테이블이 나누어졌더라도 PK, FK를 통해 문제없이 데이터베이스에 접근할 수 있으니까.