Структура данных, лучшая практика для создания истинного списка элементов, связанных тегами?

Что я имею в виду, говоря, что это истинный список «связанных по тегам»?

Предположим, что статья имеет 3 тега: A, B, C. Настоящими «связанными по тегам» статьями для этого элемента будут статьи, сначала имеющие теги A, B, C, затем (A, B), (A, C), ( Б, В) и др.

таблица: теги

tag_id
tag_title
tag_nicetitle

таблица: теги2статьи

article_id
tag_id

Используя эту структуру таблиц, слишком сложно вычислить истинные «связанные тегами».

Мы можем добавить еще одну таблицу, содержащую article_id, и это будет md5(A,B,C). Перед хэшированием мы должны отсортировать теги по алфавиту.

таблица: article_tags_hashed

id
article_id
md5
count

Эта таблица поможет нам найти статьи, содержащие точный набор тегов (A,B,C), но не поможет найти статьи, содержащие только (A, B), (A, C), (B, C)

Какова наилучшая практика?

PS: Извините за мой английский, он довольно плохой.


person Kirzilla    schedule 25.01.2010    source источник
comment
Вы делаете это с SQL и БД или на Java/C++/другом императивном языке?   -  person Dmitry    schedule 25.01.2010
comment
Нет, я делаю это с PHP/MySQL. Но есть ли разница, какой язык я использую для этого? Мне кажется, это просто вопрос структуры данных и производительности.   -  person Kirzilla    schedule 25.01.2010
comment
Ну, у вас нет никаких структур данных, кроме таблиц в СУБД, поэтому вам нужно создать запрос. Если бы вы использовали императивный язык, вы могли бы поиграть со структурами данных.   -  person Dmitry    schedule 25.01.2010


Ответы (1)


Я не думаю, что вам нужен article_tags_hashed, потому что вы можете группировать и подсчитывать результаты, когда
запрашиваете tags2articles.

Пример:

select article_id, count(article_id) as tagcnt from tags2articles
where tag_id in (...)
group by article_id
order by tagcnt desc

Статьи, содержащие наибольшее количество тегов, будут размещены первыми.

person Nick Dandoulakis    schedule 25.01.2010
comment
@ Кирзилла, если id - это ключи, то да, это должно быть быстро. Вы даже можете установить ограничение на результаты. т.е. вы можете попросить получить максимум 15 статей. - person Nick Dandoulakis; 25.01.2010