2015-02-16 2 views
0

Я создаю игру, которая должна ежедневно сохранять статистику игроков (игры, exp & золота, текущее золото), а также статистику за все время.Хранение ежедневных статистических данных в реляционной базе данных

Мой текущий подход У меня есть 3 таблицы:

table `stats_current` -> for storing player's stats on CURRENT DAY 
player_id | games_played | gold_earned | current_gold 

table `stats_all_time` -> player's stats accumulated from the very beginning 
player_id | games_played | gold_earned | current_gold 

table `stats_history` -> player's stats daily, one record for one day 
player_id | date | games_played | gold_earned | current_gold 

Каждый игрок имеет один рекорд по stats_current, одна запись на stats_all_time и ограниченные записи на stats_history таблице (например, только за последние 30 дней записываются) ,

Тогда есть работа демона/хрон, что делать эти операции на ежедневной основе:

  • Для каждого игрока:
  • Искать его запись на stats_current, получить значение.
  • Вставить новую запись в stats_history, значение от stats_current
  • Обновления записи на stats_all_time, увеличивают его значение со значениями из stats_current
  • На stats_current обнулите значения games_played, gold_earned 0. Но оставить current_gold как это является.

решения для общих задач:

  • Получить проигрыватель текущее золото Х: получить current_gold от stats_current
  • Получить статистику игрока X в последние 7 дней: выбрать 6 записей из stats_history, плюс сегодняшняя запись в stats_current
  • Получите полные игры игрока игрока X: извлечения значений из stats_history

Вопросы:

  • Является ли это жизнеспособный подход?
  • Каковы недостатки?
  • Есть ли способ оптимизировать решение?

ответ

1

Ваш подход не воспользоваться силой SQL

stats_history Чтобы получить сегодняшнюю статистику, просто использовать

SELECT * FROM stats_history WHERE Date = CURDATE() and PlayerId = PlayerId--Depending on your RDBMS you might need a different function to get the date. 

Чтобы получить все статы времени просто использовать

SELECT SUM(games_played) as games_played, SUM(gold_earned) as gold_earned FROM stats_history WHERE PlayerId = playerid 

Вы можете просто вытащить текущее золото, выбрав верхнюю запись из stats_history для этого игрока или используя y ряда других специфических стратегий RMDBS (над предложением для SQL Server, упорядочение результата по дате и добавление current_gold для MySQL и т. д.)

Ваш подход является рискованным, потому что, если ваш Chron никогда не справится, остальные две таблицы будут быть неточным. Это также необработанное дублирование данных.

Смежные вопросы