Ответ 1
В приведенных примерах существуют два механизма, которые вам понадобятся.
Я не знаю, как это делается на SO, это всего лишь предложение о решении.
Посмотрите сначала на "Аналитический". Вам придется записывать с помощью простого флага, когда пользователь посещает конкретную область в FAQ. Представьте таблицу БД с полем для каждого раздела FAQ и идентификатора пользователя. Это начинается как "N" (или 0, или же вы хотите представить свой флаг). Когда пользователь посещает эту область, вы вызываете код, чтобы перевернуть это поле на "Y". Когда все поля "Y", вы можете наградить этот значок.
Что касается "электората" и "аутсайкшн", вы можете получить эту информацию с помощью запроса на свои существующие данные, считая, что эти запросы не слишком обременительны. Вам нужно будет рассмотреть, когда следует выполнять эти проверки. Это, по сути, сводится к двум вариантам.
1) Когда выполняется действие, которое может получить награжденный значок (например, раздел "Часто задаваемые вопросы", "Голосование по вопросу, вопрос, снятый кем-то другим" )
2) Периодически (ежечасно, ежедневно и т.д.) запускайте проверку всех ваших значков на текущие данные.
Имейте в виду, что значки являются односторонними в Stackoverflow, поэтому, если вы хотите быть эквивалентными, вам не нужно учитывать логику, чтобы "не награждать" значки.