Как создать MySql Table для облака тегов? - PullRequest
8 голосов
/ 08 апреля 2010

У меня есть статьи на моем сайте, и я хотел бы добавить теги, которые описывают каждую статью, но у меня проблемы с дизайном таблицы mysql для тегов. У меня есть две идеи:

  1. каждая статья будет иметь поле «теги», а теги будут иметь формат: «тег1, тег2, тег3»
  2. создать другую таблицу под названием теги с полями: tag_name, article_id

Поэтому, когда я хочу теги для статьи с идентификатором 1, я запускаю

SELECT ... FROM tags WHERE `article_id`=1;

Но я также хотел бы узнать 3 наиболее похожих статьи, сравнивая теги, поэтому, если у меня есть статья с тегами "php, mysql, erlang" и 5 статей с тегами: "php, mysql", "erlang, ruby "," php erlang "," mysql, erlang, javascript ", я бы выбрал 1., 3. и 4., так как эти 3 имеют большинство одинаковых тегов с основной статьей.

Также другой вопрос, как лучше всего получить 10 «наиболее часто используемых тегов»?

Ответы [ 3 ]

18 голосов
/ 08 апреля 2010

Как правило, для такого рода отношений «многие ко многим» существует три таблицы:

  • Таблица "article"
    • первичный ключ = id
  • Таблица "tag"
    • первичный ключ = id
    • содержит данные каждого тега:
      • имя, например
  • Таблица "tags_articles", которая действует как таблица соединения и содержит только:
    • id_article: внешний ключ, указывающий на товар
    • id_tag: внешний ключ, указывающий на тег


Таким образом, нет дублирования данных любого тега: для каждого тега есть одна и только одна строка в таблице tag.

И для каждой статьи вы можете иметь несколько тегов (то есть несколько строк в таблице tags_articles); и, конечно же, для каждого тега вы можете иметь несколько статей.

Получение списка тегов для статьи, с этой идеей, является вопросом дополнительного запроса, например:

select tag.*
from tag
    inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123


Получение трех «самых похожих» статей будет означать:

  • выберите статьи с тегами, которые есть в первой статье
  • используйте только те, которые имеют самое важное количество идентичных тегов

Не проверено, но идея может выглядеть так:

select article.id, count(*) as nb_identical_tags
from article
    inner join tags_articles on tags_articles.id_article = article.id
    inner join tag on tag.id = tags_articles.id_tag
where tag.name in ('php', 'mysql', 'erlang')
      and article.id <> 123
group by article.id
order by count(*) desc
limit 3

В основном вы:

  • выберите идентификаторы статей для каждого тега, который присутствует в вашей первоначальной статье
    • поскольку существует внутреннее соединение, если статья в БД имеет 2 тега, которые соответствуют предложению where, без предложения group by, для этой статьи будет две строки
    • Конечно, вы не хотите переизбирать статью, которая у вас уже была, что означает, что она должна быть исключена.
  • но при использовании group by article.id в статье будет только одна строка
    • , но вы сможете использовать count, чтобы узнать, сколько тегов у каждой статьи общего с исходным
  • тогда, это только вопрос сортировки по количеству тегов и получения только третьих трех строк.
1 голос
/ 09 апреля 2010

Прежде всего, вы захотите воспользоваться предложением Паскаля МАРТИНА о дизайне стола.

Что касается поиска похожих статей, вот кое-что, с чего можно начать. Учитывая, что @article_id - это статья, для которой вы хотите найти совпадения, а @ tag1, @ tag2, @ tag3 - теги для этой статьи:

SELECT article_id, count(*)
FROM tags_articles
WHERE article_id <> @article_id
AND tag_id IN (@tag1, @tag2, @tag3)
GROUP BY article_id
ORDER BY count(*) DESC
LIMIT 3
0 голосов
/ 09 апреля 2010

да, но вы не ответили на мой главный вопрос, как получить 3 наиболее похожих статьи?

Ответ: Просто найдите те же идентификаторы тегов в объединенной таблице (tags_articles)).Соберите их и создайте шаблон.

Например: статья 1 имеет теги: 1,2 статья 2 имеет теги: 2,3,4 статья 5 имеет теги: 6,7,2 статья 7 имеет теги: 7, 1,2,3

Если вы хотите 3 наиболее похожих статьи для статьи 1, вы должны искать теги 1,2.Вы обнаружите, что статья 7 наиболее похожа, а 2 и 5 имеют некоторые сходства.

...