나만의 작은 도서관
[TIL][C++] 250827 MMO 서버 개발 88일차: DB 인벤토리 테이블 설계에 대한 고민 본문
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다.
DB 인벤토리 테이블 설계에 대한 고민
기존의 방식: 모든 아이템은 하나의 테이블에서 관리
- 지금까지 캐릭터가 소유하고 있는 아이템은 전부 CharacterInventory라는 테이블에 저장하여 관리하고 있었다. 이전 프로젝트들에서 이 방식을 사용했기 때문에 이 방식으로 설계하는 것에 대해 의문점을 가지지 않고 있었다.
- 그런데, 보다 자세하게 설계를 하면 할수록 이 방식이 그리 좋지 못한 방식이라는 것을 알게 되었다. 이유는 다음과 같다.
문제 1: 장비의 고유성
- 단순히 퀘스트 아이템이나 물약 등은 고유성이 없다. 즉, 인첸트와 같은 방식으로 고유한 추가 스텟을 가지거나 하지 않아 스택으로 쌓아두어도 문제가 없다는 것이다. 물론 물약의 경우 강화를 하거나 품질 업그레이드와 같은 시스템이 있어 변화를 줄 수는 있겠지만 추가적인 스텟이 데이터시트에 고정 값으로 있다면 이는 고유 스텟이라고 볼 수 없다
- 하지만 무기나 장비의 경우 이야기가 다르다. 랜덤 스텟이라는 개념이 들어가는 순간 모든 장비는 고유성을 가진다. 고유성을 가지는 순간 같은 template_id를 가지는 장 비더라도 각 장비는 반드시 구별가능해야 한다. 이러한 고유성은 그저 template_id만으로 장비를 식별할 수 없게 만든다.
문제 2: 장비 전용 컬럼이 너무 많음
- 늑대를 죽여서 나온 털뭉치에 강화 여부 칼럼을 넣을 필요가 있을까? 당연히 없다. 고유성이 존재하지 않는 아이템의 경우 테이블은 칼럼들만 있어도 충분하다.
character_id: 아이템 주인의 id
slot_id: 인벤토리 슬롯 id
template_id : 아이템 id
count: 아이템 개수
- 문제는 장비이다. 장비는 강화, 인챈트, 추가 옵션, 품질, 내구도, 룬 장착 여부 등 고유한 시스템들이 너무 많다. 그럼에도 장비와 아이템을 같은 테이블에서 관리하게 된다면 장비가 아닌 아이템들을 표현하는 데 있어 쓸데없는 칼럼 정보를 가지게 된다.
결론: 인벤토리 테이블 삭제, 장비/그 외 아이템 테이블 생성
- 결국 하나의 테이블로 관리하는 것이 아니라, 장비는 따로 분리된 테이블에서 관리하기로 했다. 이렇게 분리해서 관리하면 인벤토리를 채울때 조금 번거로워지겠지만 훨씬 깔끔하게 관리가 가능해진다.
- 여기서 더 나아가 소비, 기타, 나중엔 애완동물 등 여러 개의 카테고리가 생길 경우를 대비해 카테고리별 테이블을 만드는, 즉, 카테고리마다 테이블을 별도로 가지게 하는 방식을 사용하는 것이 좋아 보인다.