Хорошая модель данных для хранения счета и истории для игры


Я разрабатываю небольшую игру (я использую Play! рамки ).

В этой игре игроки отвечают на технические вопросы и выигрывают очки, когда они отвечают правильно. Кроме того, они могут выиграть некоторые награды, которые дают дополнительные очки. Это похоже на значки SO, за исключением того, что игрок выигрывает очки для этой награды.

Мне интересно, как лучше всего хранить пользовательский счет и историю из них, тем более, что я хочу иметь возможность отображение "Лучший игрок" за последнюю неделю, за последний месяц и т. д.? Эти " вершины "будут похожи на" рейтинг репутации недели в SO "(например: https://stackoverflow.com/users?tab=reputation&filter=week )

Сегодня у меня есть:

  • сущность User, где у меня есть атрибут score, который хранит текущий счет пользователя;
  • сущность QuestionHistory, в которую я помещаю каждый вопрос, на который отвечает пользователь, который имеет следующие свойства: user, answeredOn, correctAnswer, и т.д. (Я могу добавить pointsAwarded, но на данный момент все вопросы дают одинаковое количество баллов).

Благодаря сущности QuestionHistory я могу вычислить счет, выигранный одним игроком за данный период времени. Однако в него не войдут баллы, полученные премиями.

Я думал о замене сущности QuestionHistory другой сущностью, например UserActivity, которая будет хранить любую активность для этого пользователя:

  • когда он отвечает на вопрос, с результатом;
  • когда игрок подает заявку новый вопрос;
  • когда он получает награду;
  • и т. д.
Структура этой сущности может выглядеть следующим образом:
@Entity
public class PlayerActivity extends Model {

    public User user;
    public Date activityDate;
    public ActivityType type; // Define the type of activity: "QUESTION_ANSWERED", "AWARD_RECEIVED", "QUESTION_SUBMITTED", etc.
    public int score; // Points won by this activity.

}

С такой сущностью я также мог бы отображать историю активности, подобную той, что представлена на сайте SO (например: https://stackoverflow.com/users/22656/jon-skeet?tab=activity )

Что вы думаете об этом новом предложении, или есть более простой способ сделать это?
1 2

1 ответ:

Я думаю, что это определенно лучший способ подсчета очков, так как вы управляете событиями и являетесь "будущим доказательством" в случае, если вы хотите расширить деятельность, которая вознаграждает пользователей.

Да, вероятно, вы можете найти более сложные конструкции, чтобы сделать это. Но тот, который вы предлагаете, прост, и он работает, так что... идите на это :)