MySQL - Создание (простой?) поисковой системы с тегами

Я собираюсь сделать (простую?) поисковую систему для нашего будущего веб-сайта, и мне нужен совет по одному вопросу.

К содержимому на веб-сайте будут привязаны теги, но я не знаю, как правильно их хранить. Для простоты 1 заголовок с несколькими тегами. У меня есть два решения, и я хотел бы от вас узнать, какое из них лучше, или сказать другое решение;)

  1. Храните заголовки в одной таблице, а теги в другой. Каждый тег имеет titleId. Когда пользователь что-то ищет, база данных ищет в двух таблицах и возвращает результат одновременно. + Меньше данных для хранения. - Поиск в нескольких таблицах

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

    • Just has to search in one table. - More data to store.

Я говорю «производительность — это все», но что вы думаете?


person Oskar Persson    schedule 17.07.2012    source источник


Ответы (1)


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

create table page (
  id int(11) not null auto_increment,
  title varchar(128)
  ...
) engine = innodb;

create table tag (
  id int(11) not null auto_increment,
  tag_name varchar(128)
) engine = innodb;

create table page_tag (
 id int(11) not null auto_increment,
 tag_id int(11) not null,
 page_id int(11) not null,
 foreign key(tag_id) references tag(id),
 foreign key(page_id) references page(id),
 unique key(tag_id, page_id)
) engine=innodb;

Убедитесь, что вы используете таблицы innodb для обеспечения ссылочной целостности. Если вам нужен полнотекстовый поиск, добавьте дополнительную таблицу myISAM, которая в основном повторяет вашу таблицу тегов. Уникальный ключ в page_tag предотвращает дублирование записей и ускоряет соединение с этой таблицей.

Я бы также сказал, что вы должны пойти на # 2. Таким образом, вы каждый раз просматриваете одну таблицу, и с этим, вероятно, легче иметь дело.

person hsanders    schedule 17.07.2012
comment
Я бы также сказал, что вы должны пойти на # 2. Таким образом, вы каждый раз просматриваете одну таблицу, и с этим, вероятно, легче иметь дело. - Да, я так и думал. - person Oskar Persson; 18.07.2012