Я занимаюсь разработкой небольшой игры (я использую Play! Framework ).
В этой игре игроки отвечают на технические вопросы и выигрывают очки, когда они отвечают правильно.
Кроме того, они могут выиграть несколько наград, которые дают дополнительные очки.
Это похоже на значки SO, за исключением того, что игрок получает очки за эти награды.
Мне интересно, каков наилучший способ хранения пользовательской оценки и истории из них, тем более, что я хочу иметь возможность отображать «Топ-игрока» за последнюю неделю, за последний месяц и т. Д. ?
Эти «вершины» будут похожи на «Рейтинг репутации недели в SO» (например: https://stackoverflow.com/users?tab=reputation&filter=week)
Сегодня у меня есть:
- Объект
User
, где у меня есть атрибут score
, в котором хранится текущий счет пользователя;
- A
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)
Что вы думаете об этом новом предложении, или есть более разумный способ сделать это?