В зависимости от того, как далеко вы хотите зайти, ваша схема может быть довольно сложной. Мне кажется, что базовые элементы, которые нужно отслеживать:
Badges awarded
Points earned
Пока довольно просто, но вы хотите иметь возможность динамически создавать новые значки и новые категории очков. Награды за значки будут зависеть от начисления баллов в одной или нескольких категориях баллов, которые будут составлять определенную сумму. Таким образом, вам необходимо отслеживать отношения между категориями очков (и заработанными очками) и значками:
Point categories
Badge categories
Таким образом, ключом будет таблица ваших пользовательских баллов, которая будет ссылаться на категории баллов, которые ссылаются на значки. Пользователи зарабатывают очки в определенной категории, что будет способствовать получению очков за один или несколько значков.
badges:
badge_id
badge_name
required_points
....
point_categories:
point_id
category_name
weighting (optional)
...
point_groups:
badge_id
point_id
weighting (optional)
...
user_points:
user_id
point_id
points
...
user_badges:
user_id
badge_id
points_earned
badge_awarded (yes/no)
...
Ваш интерфейс администратора позволит кому-то создать новый значок и выбрать, какие категории баллов необходимы для получения этого значка (point_groups). Всякий раз, когда пользователь зарабатывает очки (user_points), вы обновляете таблицу user_points, а затем определяете, на какие значки эти баллы могут быть внесены (point_groups). Затем вы перекомпилируете баллы для значков, на которые повлияли заработанные баллы, и обновите таблицу user_badges с помощью point_earned. Затем проверьте поле points_earned в user_badges с обязательными точками в таблице значков.
Вы можете стать намного интереснее, назначив разные веса разным категориям очков или даже разным весам для категорий очков для определенных значков. Но эта настройка позволила бы создавать неограниченное количество значков и категорий точек и управлять ими довольно легко, не меняя структуры таблиц.
Если это совсем не то, что вы ищете, то я думаю, что я должен, по крайней мере, получить один или два голоса за много печатания.