Как лучше сохранять теги к посту?

Тема в разделе "Базы данных", создана пользователем danneo, 8 июл 2016.

Модераторы: latteo
  1. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.475
    Симпатии:
    114
    Нужно к записям добавлять теги (фразы). При добавлении новой записи вводить часть тега, и выводилось чтобы варианты уже добавленных ранее (чтобы выбрать из предложенных). Не знаю, как в большинстве CMS сделаны теги.
    Я вижу два решения:
    1. во внешнюю таблицу (id, text, postid) сохранять теги поста. Теги будут дублироваться.
    2. во внешнюю таблицу (id, text) сохранять только уникальные теги, а у поста сохранять список id тегов: tagsid (12,32,532 и т.д.). Так таблица будет меньше.
    Насколько знаю, в DLE, WP делается по 1-му варианту - теги к каждому посту. Где-то видел, что у тега считается счетчик, чтобы потом выводить в облаке (по размерам счетчика). Но мне облако не нужно.
    В чем "подвох"? Какой вариант лучше?
     
  2. Nei

    Nei Nosce te ipsum

    Регистр.:
    5 сен 2009
    Сообщения:
    648
    Симпатии:
    513
    По первому варианту есть возможность отредактировать название тега, думаю, поэтому используется такой вариант.
     
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.582
    Симпатии:
    1.484
    Только через промежуточную таблицу связей:
    id, text - теги, на поле text поставить UNIQUE KEY
    tag_id, post_id - связи
    тогда отредактировав тег в таблице тегов, он автоматически меняется для всех постов, через таблицу связей можно подсчитать сколько у тега новостей, при построении облака тегов отпадает фильтр group by по текстовому полю
     
    danneo и Nei нравится это.
  4. GowarD

    GowarD Писатель

    Регистр.:
    25 мар 2017
    Сообщения:
    6
    Симпатии:
    0
    Если "сохранять список id тегов: tagsid (12,32,532 и т.д.)" тогда выборка будет что-то вроде SELECT CONCAT(text) FROM tags WHERE tag_id IN ( 12,32,532 и т.д. ) против первого варианта SELECT text FROM tags WHERE post_id = 532
    Выводы: 1-й вариант выборка будет выполнятся быстрее, 2 - более понятная структура, и любой другой специалист легко разберется.
     
    Последнее редактирование: 27 мар 2017
  5. dodger-911

    dodger-911 Создатель

    Регистр.:
    24 авг 2017
    Сообщения:
    11
    Симпатии:
    0
    ИМХО лучше 3-й вариаент. Есть таблица постов, есть таблица уникальных тегов и есть таблица связи id поста, id тега (может быть несколько строк). Тогда структура еще понятнее и скорость обработки запросов если поставить индексы будет высокая