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

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

http://github.com/cnprog/CNPROG

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

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

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

Пока что В ответе на критерий определения лучшего пути к магазину-бейджу говорится, что запрос не выполняется, как,

"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 Если кто-то мог бы более подробно объяснить ответ на вопрос критерий выбора лучшего способа хранения , но приведите пример с критериями "правило", " "и проектирование базы данных

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


1 Ответ

5 голосов
/ 03 марта 2011

Да, ваша интуиция верна. По сути, это то, что люди в базе данных назвали бы материализованным представлением . Например, чтобы получить достижение для количества сообщений> 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.

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

...