Система достижения значков, такая как SO: Используемые данные + Критерии (мгновенные награды и задания cron)

Я смотрел на открытый исходный код SO,

http://github.com/cnprog/CNPROG

Я не знаю Python/Django, но я все еще могу читать, что происходит,

Разработчики, похоже, только награждают значками заданиями cron, Награды присуждаются методами, являющимися "Правилами" Критерии, которые должны быть выполнены для достижения награды.

в этот файл, который является критерием,

Тем не менее В ответе best-way-to-store-badge-criteria его высказывание не запускает запрос типа

"select count(*) from posts where user = :user"// for every post.

Какой тип похож на метод CNPROG, но вместо этого

имеют простое правило, которое следит за каждым сообщением и "подсчитывает их", сохраняя правила в профиле пользователя.

Итак, по словам "подсчет их", означает ли это, что было бы лучше записать все в одной таблице, например,

class UserStats

      int voteUpCount
      int voteDownCount
      int score  
      int commentCount
      int viewCount
      int offensiveFlagCount
      int imageCount
      int feedbackCount
      int commentEditCount
      int commentDeleteCount
      int questionCount
      int questionEditCount
      int questionDeleteCount

Затем, используя эти данные, создайте из него правила с простым if(commentCount > 10)... при каждом комментарии, который публикуют пользователи, затем заготовьте SQL-запрос

Q Если кто-то может объяснить ответ на вопрос best-way-to-store-badge-criteria, но привести пример с "правилом", критерии "и дизайн базы данных

Они будут использоваться с некоторыми "за действие пользователя" и заданиями cron для предоставления значков


Ответ 1

Да - ваша интуиция верна. Это то, что люди базы данных могли бы назвать материализованным представлением . Например, чтобы дать достижение для post count > 30, сделайте что-то вроде этого:

posts {
   id,
   user_id,
   content
}

users {
   user_id,
   post_count,
   has_thirty_posts
}

Когда сообщение вставляется в таблицу posts, добавьте 1 в post_count в таблицу users. Если post_count > 30, установите has_thirty_posts = true.

Существуют другие способы сохранения схемы. Это просто грубое упрощение, но оно должно дать вам эту идею. Это также называется Denormalization (т.е. Сохранение избыточных данных).