게임 통계 서버에서 사용하는 관계형 데이터베이스(RDBMS)는 주로 게임 내 이벤트, 유저의 활동 기록, 매치 결과 등을 효율적으로 저장하고 조회할 수 있도록 설계됩니다. 이러한 데이터는 다양한 통계를 생성하는 데 사용되며, 이를 위해 적절한 테이블 구조 설계가 필요합니다.

테이블 설계 개요

  1. 유저 테이블 (Players/Users)

    • 유저에 대한 기본 정보 및 게임 내 활동 기록을 저장합니다.
    • 유저의 상태, 게임 내 레벨, 경험치, 보유 아이템 등도 포함될 수 있습니다.
    • 주로 id, username, level, experience, total_games, total_wins 등의 필드를 가집니다.
  2. 매치 테이블 (Matches)

    • 각 게임 매치에 대한 기록을 저장하는 테이블입니다.
    • 게임 시작 및 종료 시간, 참여 유저 정보, 승패 결과, 매치 결과 등을 저장합니다.
    • 보통 match_id, player_id, result, match_start, match_end, score 등의 필드를 가집니다.
  3. 아이템 테이블 (Items)

    • 유저가 획득한 아이템에 대한 정보를 저장합니다.
    • 게임 내 상점에서의 구매 이력이나 전투 중 획득한 아이템 등을 기록합니다.
    • item_id, item_name, player_id, acquired_at, item_type 등의 필드가 포함됩니다.
  4. 이벤트 테이블 (Events)

    • 게임 내 발생하는 다양한 이벤트(퀘스트 완료, 특정 레벨 달성, 특정 아이템 획득 등)를 기록합니다.
    • event_id, player_id, event_type, event_timestamp 등의 필드를 가집니다.

관계형 데이터베이스 설계 예시

1. 유저 테이블 (Players)

CREATE TABLE players (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username VARCHAR(100) NOT NULL,
    level INTEGER DEFAULT 1,
    experience INTEGER DEFAULT 0,
    total_games INTEGER DEFAULT 0,
    total_wins INTEGER DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • id: 유저의 고유 식별자 (Primary Key)
  • username: 유저의 이름
  • level: 유저의 게임 내 레벨
  • experience: 유저의 경험치
  • total_games: 유저가 참여한 게임 총 수
  • total_wins: 유저가 이긴 게임 수
  • created_at: 유저가 처음 등록된 시간

2. 매치 테이블 (Matches)

CREATE TABLE matches (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    player_id INTEGER,
    result VARCHAR(10) CHECK(result IN ('win', 'lose')),
    score INTEGER,
    match_start TIMESTAMP,
    match_end TIMESTAMP,
    FOREIGN KEY (player_id) REFERENCES players(id)
);
  • id: 매치의 고유 식별자 (Primary Key)
  • player_id: 해당 매치에 참여한 유저의 ID (Foreign Key, players 테이블 참조)
  • result: 해당 매치의 결과 (win 또는 lose)
  • score: 유저의 매치 점수
  • match_start: 매치 시작 시간
  • match_end: 매치 종료 시간

3. 아이템 테이블 (Items)

CREATE TABLE items (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    item_name VARCHAR(100),
    player_id INTEGER,
    acquired_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    item_type VARCHAR(50),
    FOREIGN KEY (player_id) REFERENCES players(id)
);
  • id: 아이템의 고유 식별자
  • item_name: 아이템의 이름
  • player_id: 아이템을 획득한 유저의 ID (Foreign Key, players 테이블 참조)
  • acquired_at: 아이템을 획득한 시간
  • item_type: 아이템의 유형 (무기, 방어구, 소비 아이템 등)

4. 이벤트 테이블 (Events)

CREATE TABLE events (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    player_id INTEGER,
    event_type VARCHAR(50),
    event_description TEXT,
    event_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (player_id) REFERENCES players(id)
);
  • id: 이벤트의 고유 식별자
  • player_id: 이벤트를 발생시킨 유저의 ID (Foreign Key, players 테이블 참조)
  • event_type: 이벤트 유형 (예: '퀘스트 완료', '레벨 업')
  • event_description: 이벤트에 대한 설명
  • event_timestamp: 이벤트 발생 시간

테이블 간 관계

  1. 1:N 관계 (Players와 Matches, Items, Events):

    • 하나의 유저는 여러 매치, 아이템, 이벤트를 가질 수 있습니다. 이는 player_id를 통해 players 테이블과 참조 관계를 맺고 있으며, Foreign Key로 연결됩니다.
  2. N:M 관계 (선택 사항):

    • 만약 팀 플레이를 지원하는 게임이라면, 다대다(N:M) 관계를 위한 별도의 테이블을 만들어 매치에 여러 유저가 참여할 수 있도록 구성할 수 있습니다. 예를 들어, match_participants 테이블을 두어 여러 유저가 하나의 매치에 참가할 수 있도록 확장할 수 있습니다.
    CREATE TABLE match_participants (
        match_id INTEGER,
        player_id INTEGER,
        FOREIGN KEY (match_id) REFERENCES matches(id),
        FOREIGN KEY (player_id) REFERENCES players(id),
        PRIMARY KEY (match_id, player_id)
    );

통계 생성 예시

이제 위에서 설계한 데이터베이스를 기반으로 간단한 통계를 SQL로 생성할 수 있습니다.

1. 유저의 승률 계산

SELECT username, total_wins, total_games, 
       (total_wins * 1.0 / total_games) AS win_rate
FROM players
WHERE total_games > 0;

2. 특정 유저의 매치 히스토리 조회

SELECT m.id, m.result, m.score, m.match_start, m.match_end
FROM matches m
JOIN players p ON m.player_id = p.id
WHERE p.username = 'player1';

3. 최근 아이템 획득 기록 조회

SELECT i.item_name, p.username, i.acquired_at
FROM items i
JOIN players p ON i.player_id = p.id
ORDER BY i.acquired_at DESC
LIMIT 10;

4. 이벤트 로그 조회

SELECT e.event_type, e.event_description, e.event_timestamp, p.username
FROM events e
JOIN players p ON e.player_id = p.id
ORDER BY e.event_timestamp DESC;

결론

게임 통계 서버의 데이터베이스 설계는 유저의 활동을 효율적으로 기록하고 이를 분석할 수 있도록 설계하는 것이 핵심입니다. 유저 테이블, 매치 테이블, 아이템 테이블, 이벤트 테이블 등을 적절히 설계하면 게임 내 다양한 데이터를 수집하여 유의미한 통계를 생성할 수 있으며, 이러한 통계는 게임 밸런스 조정, 유저 만족도 향상, 게임 경제 분석 등에 활용됩니다.

+ Recent posts