Этот вопрос несколько отличается от типичного вопроса «как создать систему тегов», который подробно обсуждался в SO и других местах.
Я хочу использовать теги краудсорсинга, чтобы вам не приходилось полагаться на владельца каждого документа для полного перечисления применимых тегов. В то же время я не хочу, чтобы случайное чихание могло испортить все теги путем преднамеренной ошибки в большом количестве документов.
Как система, как эта работает в целом? Например, Slashdot.org полагается на что-то подобное, чтобы придумывать теги истории. (никогда не редактируя теги, мне было бы интересно узнать больше о том, как это работает.)
Теперь, чтобы сделать это более конкретным: предположим, что моя схема БД с тегами выглядит следующим образом:
doc: id, name, ...
tag: id, tag_name
doc_tag: doc_id, tag_id, user_id
Теперь каждый пользователь может назначать свои собственные теги документам. Один из способов определения консенсуса - посмотреть на долю людей, которые пометили документ определенным тегом. Это приводит к чудовищности оператора SQL ниже.
SELECT
doc_id, tag_id,
num_times_tagged, taggers_count,
num_times_tagged/taggers_count AS popularity
FROM doc_tag
LEFT JOIN (
SELECT doc_id, tag_id, COUNT(*) AS num_times_tagged
FROM doc_tag GROUP BY doc_id, tag_id
) num_times
ON doc_tag.doc_id = num_times.doc_id AND
doc_tag.tag_id = num_times.tag_id
LEFT JOIN (
SELECT doc_id, COUNT(DISTINCT user_id) AS taggers_count
FROM doc_tag GROUP BY doc_id
) num_taggers
ON doc_tag.doc_id = num_taggers.doc_id
GROUP BY doc_tag.doc_id, doc_tag.tag_id
Я иду по этому поводу совершенно неправильно? Это кажется очень дорогим запросом. Предположим, я просто хотел получить список документов и главных тегов для каждого - как бы я написал для этого объединение? Я не хочу запускать этот запрос для каждого документа, который я получаю!
Спасибо за любой совет.
David