Система достижений/значков

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

В PHP и MySQL было бы ясно, что некоторые достижения заработаны немедленно (когда в случае SO с особыми действиями предпринято специализированное действие: заполнено все поля профиля), хотя я знаю обновления SO и назначает значки через определенное количество времени, С таким количеством пользователей и значков это не создаст проблем с производительностью (с точки зрения масштаба: большое количество пользователей и значков).

Итак, структура базы данных, которую я предполагаю, будет такой простой, как:

Badges     |    Badges_User      |    User
----------------------------------------------
bd_id      |    bd_id            |  user_id
bd_name    |    user_id          |  etc
bd_desc    |    assigned(bool)   |  
           |    assigned_at      |

Но, как утверждают некоторые люди, было бы лучше иметь инкрементный стиль, поэтому пользователь, у которого есть 1 000 000 сообщений в форуме, не замедлит выполнение каких-либо функций.

Будет ли это еще одна таблица для значков, которые могут быть инкрементальными или просто полеми прогресса в таблице badges_user выше?

Благодарим за чтение и сосредоточим внимание на масштабируемости желаемой системы (например, тысяч пользователей и 20-40 значков).

РЕДАКТИРОВАТЬ: для некоторых можно смутить некоторую путаницу, которую я назначил как дату/время, критерии для награждения значка лучше всего помещать внутри подготовленных запросов/функций для каждого значка, не так ли? (лучшая гибкость)

Ответ 1

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

EDIT: для значков достижений запустите прослушиватель событий при каждом представлении (только для пользователя, отправляющего курс), и наградите любой соответствующий значок на месте. Для значков, основанных на времени, я каждую ночь выполнял работу CRON. Проходите через полный список пользователей один раз и награждайте значки, если применимо.

Ответ 2

относительно эскиза, который вы включили: избавиться от булевого столбца на badges_user. здесь нет смысла: это отношение определено в терминах предиката "user_id" заработал значок bd_id при назначении_а ".

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

Ответ 3

Я бы сохранил аналогичную структуру с тем, что у вас есть

Badges(badge_id, badge_name, badge_desc)
Users(user_id, etc)
UserBadges(badge_id, user_id, date_awarded)

И затем добавьте таблицу отслеживания в зависимости от того, что вы хотите отслеживать, и @какой уровень детализации... затем вы можете обновить таблицу и установить триггеры на нее, чтобы "наградить" значками

User_Activity(user_id, posts, upvotes, downvotes, etc...)

Вы также можете отслеживать статистику с другого направления и запускать награды значков

Posts(post_id, user_id, upvotes, downvotes, etc...)


Некоторые другие хорошие моменты сделаны здесь

Ответ 4

Я думаю, что это один из тех случаев, когда ваша таблица "многие-ко-многим" (Badges_User) подходит.
Но с небольшим изменением, так что неназначенные значки не сохраняются.

Я предполагаю, что assigned_at - это дата и/или время.
По умолчанию указано, что пользователь не имеет значков.

Badges     |    Badges_User      |  User
----------------------------------------------
bd_id      |    bd_id            |  user_id
bd_name    |    user_id          |  etc
bd_desc    |    assigned_at      |  
           |                     |

Таким образом сохраняются только отмеченные значки. Строка Badges_User создается только тогда, когда пользователь получает значок.

С уважением
    Sigersted