안녕하세요. 엄청 오랜만에 글을 씁니다. 앞으로 1~2개의 글만 더 쓰면은 DB도 마무리가 되고 실제로 보고 즐길 수 있는 실 트게더 개발로 넘어가게 됩니다.
오늘 내용은 어떤 DB의 기능이 아니라 DBA가 DB를 작업할때 반드시 참고해야 하는 정규화에 대해서 알아보겠습니다.
정규화에 대한 설명:https://mangkyu.tistory.com/110
정규화의 목적은 쉽게 설명하면은 데이터의 효율적인 관리입니다. 예시를 한번 들어보겠습니다.
LOL DB에 이름이 Game History인 테이블이 있다고 가정을 해봅시다. 그러면 매 판마다 이렇게 게임을 하고 난 후에 전적이 기록이 될텐데 실제 운영되는 DB의 데이터는 한두건이 아니라 적게는 수만건에서 많게는 그 이상의 데이터가 테이블에 기록이 되있을 것입니다.
그렇다고 한다면은 효율적인 테이블 관리를 위해서는 어떻게 해야 할까요? 가장 먼저 우리가 생각할 수 있는 방법은 불필요한 데이터를 줄여 나가는 것입니다. 그러면은 Game History테이블에서 불필요한 데이터가 무엇이 있을까요? 아마도 GAME,NO,NAME컬럼일 것입니다. 왜 필요없는지 한번 하나씩 따져보도록 하겠습니다.
GAME 컬럼 : 롤 게임 내에서 관리하는 테이블인데 굳이 GAME이라는 컬럼을 만들어서 LOL이라는 불필요한 데이터를 이중으로 저장할 필요가 있을까요? 혹자는 말할 수도 있습니다. "요즘은 TFT도 롤 내에서 할 수 있는데요?"라고 한다면은 해당 컬럼은 가치가 있는 컬럼이니 삭제할 필요가 없어 보일 수도 있습니다. 하지만 해당 테이블의 나머지 컬럼을 본다면은 KDA 컬럼이 있는 것으로 보아서 TFT의 데이터를 저장하는 테이블은 아닌듯 하니 삭제하는것이 맞을듯 합니다.
NO 컬럼 : 게임이력에 대한 정보만 있으면 될듯 한데 굳이 몇번째인지를 나타내는 번호는 필요가 없습니다. 따라서 해당 컬럼은 지워줘도 됩니다.
NAME컬럼 : 닉네임 컬럼은 굳이 게임 이력을 관리하는 테이블에는 필요가 없을듯 합니다. 왜냐하면 게임 이력을 가져오고 싶다면 닉네임이 아닌 ID로 데이터를 가져와야 할 것입니다. 닉네임은 언제든지 바뀌는 데이터니 Key값으로의 가치는 없습니다.
따라서 해당 테이블을 정규화 한다면 아래와 같이 나올 것입니다.
자 이런식으로 중복되거나,혹은 불필요한 부분들을 최소화 시키는 작업을 정규화 라고 합니다.
이 외에도 추가적인 정규화 내용들이 있지만 심도 있는 내용은 구글에 검색해보시거나 제가 첨부한 링크에서 확인해 보시면 될듯 합니다. 이 정규화를 얼마나 잘 하는지에 따라서 서버의 속도가 천차만별로 달라지게 되며 본인의 몸값을 결정할 수 있는 기술입니다.
오늘 내용은 여기까지 입니다. 다음 시간에는 아마 마지막?이 될 수도 있는 테이블간 Join에 대해서 알아보도록 하겠습니다.
항상 감사드립니다.
댓글 2개 ▼