Создание облака тегов - нет действительного источника тегов - PullRequest
1 голос
/ 27 декабря 2010

Итак, в моей базе данных проиндексировано несколько тысяч статей, я хочу создать облако тегов, основываясь только на том, сколько статей имеют эти теги, поэтому, если 1000 статей имеют тег "global", он будет больше, чем "национальный "тег, который есть только в 500 или около того статей.Кажется, эта концепция меня не сильно озадачивает, за исключением того, что у меня нет действительного источника тегов.

Смотрите, каждая статья имеет поле тегов в базе данных в формате: tag1, tag2, anothertag, опять же с тегом

Итак, я собирался выполнить запрос DISTINCT, чтобы получить все различные теги, но я понял, что просто соберу все различные расположения тегов.Так как же я могу запросить в моей базе данных все использованные теги и их количество?

Спасибо, ребята.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2010

Это должно быть довольно простым упражнением для изменения схемы базы данных для нормализации тегов.

Вместо столбца тегов у вас должна быть таблица тегов:

create table tags
(
  id int,
  name varchar2(50),
  ...
)

Поскольку отношения очевидны для многих, вам понадобится таблица ссылок:

create table articles_tags
(
    article_id int,
    tag_id
)

Тогда будет довольно легко преобразовать текущие теги в новый тип, вот какой-то псевдокод!

1) tags = `select id,tags from articles`
2) for each tag in tags
3) if tag exists in `tags` get tag ID, else create row in `tags` and get tag id
4) using article id and tag id, create entry in articles_tags
5) alter table remove column tags!

Это позволит вам создать облако тегов, просто запустив что-то вроде этого:

select t.name,count(*)
from tags t
inner join articles_tags at
on at.tag_id = t.id
group by t.name

Это также значительно упростит повторное использование тегов с помощью функции автозаполнения.

2 голосов
/ 27 декабря 2010

У каждой статьи есть поле тегов в базе данных в формате: тег1, тег2, другой тег, снова с тегом

Ваша база данных не нормализована. Теперь вы должны заплатить цену с точки зрения повышенной сложности.

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

$counts = array();
$result = mysql_query('SELECT tags FROM articles');
while ($record = mysql_fetch_array($result))
{
  $record_tags = split(',', $record['tags']);
  foreach ($record_tags as $tag)
  {
    ++$counts[$tag];
  }
}

Теперь $counts - это массив, в котором тегами являются ключи, а частотой - значения.

Конечно, это создает ужасную нагрузку на базу данных. Лучшим решением является нормализация базы данных: добавьте таблицу article_tags со столбцами tag и article, где article - это внешний ключ, указывающий на таблицу articles. tag является либо самим литеральным тегом, либо внешним ключом в таблицу tags. Последнее необходимо, если вы хотите хранить метаинформацию о тегах (описание, синонимы и т. Д.).

Если вы сделали это, код уменьшается до

$counts = array();
$result = mysql_query(
  'SELECT tag, COUNT(*) AS cnt FROM article_tags GROUP BY tag'
);
while ($record = mysql_fetch_array($result))
{
  $counts[$record['tag']] = $record['cnt'];
}

Кроме того, ознакомьтесь с нормализацией базы данных, например, Википедия: Нормализация базы данных , если вы этого еще не сделали.

...