как сохранить теги (ключевые слова) в базе данных? - PullRequest
11 голосов
/ 21 декабря 2010

Я хочу создать простую систему тегов, используя php и mysql, чтобы пользователи могли добавлять несколько тегов через форму. Мой вопрос заключается в том, что я должен сохранить теги в виде массива в одном столбце базы данных? например. "tag1, tag2, tag3" .. или у меня должны быть отдельные столбцы в таблице базы данных, где я должен сохранять каждый тег в каждом столбце. Я надеюсь, что мой вопрос ясен. Спасибо.

Ответы [ 3 ]

24 голосов
/ 21 декабря 2010

Я бы, наверное, не сказал ни того, ни другого.Используйте отношение «многие ко многим» между тегами и помечаемым объектом.Например, если помечаемая вещь является вопросом, таблицы могут выглядеть так:

Question:
    QuestionId
    Title
    Body

Tag:
    TagId
    Name

QuestionTags:
    QuestionId
    TagId
9 голосов
/ 09 декабря 2012

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

я думаю, что ответ Клауса Быскова Хоффманн был неплохим, но я бы добавил к этому и сохранил список тегов как таблицу «многие ко многим», как он сказал, но также как сериализованную строку в некоторой форме (либо через serialize, как сказал user466764, или просто через запятую, как вы сказали сами, что может быть обработано с помощью implode / explode) в основной таблице.

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

таблица «многие ко многим» (таблица тегов) предназначена только для поиска. чтобы повысить производительность поиска, я бы ограничил доступ к этой таблице ТОЛЬКО для поиска (и, конечно, нам нужно обновить его при редактировании тегов), но никогда не запрашивать его только для просмотра / перечисления тегов где-либо. и сериализованный список тегов предназначен для каждого места, где вы просматриваете соответствующую статью или элемент - при отображении этого элемента у вас уже есть таблица, и каждый раз, когда вы хотите отобразить эту страницу, выполняется еще один запрос к таблице тегов. ненужный, когда у вас уже есть список в главной таблице. будьте внимательны при обновлении тегов, чтобы всегда обновлять их в обоих местах, предпочтительно с помощью единственной функции установки, которая выполняет оба действия, и у вас не должно быть проблем с несогласованностью.

0 голосов
/ 21 декабря 2010

Вы можете использовать сериализацию и десериализацию для хранения ключевых слов в одном поле.Больше информации здесь http://php.net/manual/en/function.serialize.php

Как-то так ...

$keywords = array('apple', 'pear', 'banana', 'peach');
$keywords_serialized = serialize($keywords);
$sql = INSERT INTO dbtable (keywords) VALUES ($keywords_serialized);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...