Проектирование архитектуры системы достижений(achievements)
Мой путь был бы таким:
— key-value db;
— каждое действие генерирует событие;
— для каждого достижения есть свой подписчик который случает необходимые ему собития;
— при срабатывании подписчик читает поле в базе с ключем __;
— сравнивает с лимитом;
— увеличивает его или генерирует событие добавления нового достижения.
Не претендую на решение, но идея такова:
Большая часть достижений это количество каких то действий, то есть нужно что то сделать несколько раз. Для этих целей создается таблица, с полями id пользователя, достижение 1, достижение 2,… достижение N. Соответственно при выполнении нужного действия нужно достижение в таблице наращивается.
Далее можно создать таблицу с уже полученными достижениями, чтобы можно уже было учитывать те достижения для получения которых нужно выполнить несколько конкретных.
Само присвоение достижений думаю проще будет вести триггерами которые будут проверять достигнуто ли достижение когда обновляется запись. 
Такой вариант позволит вам в любой момент добавлять достижения, обычным добавлением поля в таблицу, и триггера на более сложные достижения