Intro

이 글에서는 Teamfight Tactics 게임 데이터를 다뤄보기 위해 효율적인 데이터 베이스 설계를 고민한 내용을 다루려고 합니다. 이 설계는 TFT API로 얻을 수 있는 데이터를 체계적으로 저장하고, 분석 작업을 수월하게 하기 위한 데이터 베이스 구조를 목표로 합니다. 특히 중복 데이터를 최소화하고 유연성을 높이는데 중점을 두고 있습니다.

 

1. TFT API 데이터 구조

 

TFT API 에서 가져오는 주요 데이터는 크게 세 가지로 나눠 집니다.

  • 유저 정보 : 각 플레이어의 고유한 ID(puuid), 랭크 정보, 승리/패배 통계 등이 포함
  • 게임 정보 : 각 게임의 고유 ID(match id), 버전 정보, 플레이 한 유저 id
  • 게임 결과 : 각 게임의 고유 ID, 게임 시간, 유저가 사용한 유닛, 특성, 증강체 등 세부적인 결과 데이터

TFT API로 가져올 수 있는 정보는 이와 같고 추후에 어떻게 API 데이터를 가져왔는 지에 대해서도 써볼 예정입니다.

 

2. 초기 스키마 설계

처음에는 데이터 저장을 단순하게 설계하려 했습니다. 각 테이블에 필요한 모든 정보를 저장하고, 서로 관계를 연결하는 방식이었습니다. 하지만 여기서 게임 결과 데이터에 다양한 속성을 포함되어 있는데, 이 중에 특성, 유닛, 증강체 데이터의 경우 list로 포함되어 있어 추후에 데이터 분석을 하기에는 활용하기 어렵고 한 속성에 여러 값이 존재하는 것이 좋지 않기에 각각의 엔터티로 분리하기로 했다. 이러한 설계로 우선 다음과 같은 ER 다이어그램을 만들어 보았다.

 

TFT 분석 데이터 ER 구조

 

하지만 이러한 구조는 시간이 지날 수록 몇 가지 문제를 야기할 수 있음을 깨달았습니다.

  • 데이터 중복 : 한 유저가 여러 게임에서 다양한 유닛, 특성, 증강체를 사용하는데 매번 동일한 user id, game id를 반복해서 저장하게 되면 데이터 중복이 심해집니다.
  • 확장성 문제 : 더 많은 데이터가 추가될 수록 테이블이 복잡해지고 데이터 분석에 쓸 데이터를 관리하기 어려워 질 것이라 생각했습니다.

Point : TFT 게임 특성 상 매 판마다 유저들이 다양한 유닛과 특성을 이용하기에 user id, game id를 일일히 반복해서 저장하면 비효율적일 것!

 

 

3. 개선된 데이터베이스 구조

이 문제를 해결하기 위해 테이블을 나누고, 관계형 데이터베이스의 장점을 살려 중복 데이터를 최소화하는 방향으로 설계를 변경했습니다.  이 과정에서는 또한 관계성을 명확히 하기 위해 UserGame 테이블을 중심으로 설계를 개선했습니다.

 

연결 관계 

1) 유저 ↔ UserGame : 한 사용자는 여러 게임 세션을 가질 수 있습니다.

2) 게임 정보 ↔ UserGame : 하나의 게임 정보는 여러 사용자 게임 세션에 사용될 수 있습니다.

3) UserGame ↔ 게임 결과 : 각 사용자 게임 세션은 하나의 게임 결과를 가집니다.

4) UserGame ↔ 사용 유닛, 사용 증강체, 사용 특성 : 각 사용자 게임 세션은 각각의 사용된 유닛,증강체,특성을 가집니다.

TFT 분석 데이터 ER 개선된 구조

 

UserGame은 각 유저가 게임에 참여한 정보를 저장하며, 각 유닛, 특성, 증강체는 user_game_id로 연결됩니다. 이를 통해 user_id, game_id의 중복을 줄일 수 있고, 확장성을 높였습니다. 이 테이블로 인하여 데이터의 중복을 최소화하고, 유연하고 확장 가능한 구조를 만드는 것이 가능했습니다. 이렇게 분리된 테이블 구조는 몇 가지 이점을 제공합니다.

  • 중복 제거 : UserGame 테이블을 통해 유저와 게임 정보를 한 번만 저장하고, 나머지 사용 유닛, 사용 증강체, 사용 특성 테이블에서 이를 참조함으로 써 중복을 줄일 수 있습니다.
  • 확장성 : 추후에 유닛, 증강체, 특성에 관한 속성이나 데이터를 추가 할 경우, 기존 테이블에 간단히 추가 할 수 있어서 확장성이 좋을 것입니다.
  • 쿼리 효율성 : 각 테이블이 명확한 관계를 가지고 있어 정보를 쉽게 검색 할 수 있습니다. user_game_id를 통해 각 테이블을 연결해 데이터를 빠르게 조회할 수 있습니다. 

이 구조는 특히 데이터를 직관적으로 관리 할 수 있을 것이고 각 데이터에 대한 분석을 위해 효율적으로 작동할 수 있도록 설계해보았습니다.

 

Conclusion

이번 데이터베이스 설계에서는 TFT API 데이터를 효과적으로 저장하고, 나중에 분석할 때도 성능과 유지보수를 고려한 구조를 목표로 했습니다. 이 과정에서 중복 최소화, 유연한 테이블 구조를 통해 효율적인 데이터를 관리할 수 있는 방법을 찾으려 노력했고, 추후에 추가될 데이터들(유닛, 증강체, 특성 정보 관련)들을 고려하였습니다. 데이터 베이스 설계를 직접 함으로써 데이터의 특성과 요구 사항에 맞게 데이터 구조를 적절하게 설계하는 것은 중요하다고 느꼈고, 이 구조를 기반으로 앞으로 어떻게 데이터를 데이터베이스 까지 적재하는 지 구체적인 과정에 대해서도 설명할 것입니다.

 

+ Recent posts