Каков наиболее эффективный способ хранения тегов в базе данных?

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

Моя идея такова:

Table: Items
Columns: Item_ID, Title, Content

Table: Tags
Columns: Title, Item_ID

Это слишком медленно? Есть ли лучший способ?

Ответ 1

В одном элементе будет много тегов. И один тег будет принадлежать многим элементам. Это подразумевает, что вам вполне может понадобиться промежуточная таблица для преодоления препятствия "многие-ко-многим".

Что-то вроде:

Таблица: Элементы
Столбцы: Item_ID, Item_Title, Content

Таблица: Теги
Столбцы: Tag_ID, Tag_Title

Таблица: Items_Tags
Столбцы: Item_ID, Tag_ID

Возможно, ваше веб-приложение безумно популярно и нуждается в денормализации по дороге, но это бессмысленно замалчивает воды слишком рано.

Ответ 2

Вы должны прочитать сообщения Филиппа Келлера о пометке схем базы данных. Он пробует несколько и сообщает о своих результатах, как в условиях упрощения построения общих запросов, так и с точки зрения производительности. Количество тегов, количество помеченных элементов и количество тегов на элемент - все факторы. Посты - с 2005 года; С тех пор я не знаю никаких обновлений.

Ответ 3

На самом деле я считаю, что де-нормализация таблицы тегов может быть лучшим способом продвижения вперед, в зависимости от масштаба.

Таким образом, таблица тегов просто имеет теги, itemid, тэг.

Вы получите повторяющиеся тэги, но это делает добавление/удаление/редактирование тегов для определенных элементов МНОГО более простым. Вам не нужно создавать новый тег, удалять выделение старого и повторно назначать новый, вы просто редактируете тэг.

Для отображения списка тегов вы просто используете DISTINCT или GROUP BY, и, конечно же, вы можете подсчитать, сколько раз тег используется легко.

Ответ 4

Я бы предложил использовать промежуточную третью таблицу для хранения тегов <= > ассоциаций элементов, так как у нас есть отношения "многие ко многим" между тегами и элементами, т.е. один элемент может быть связан с несколькими тегами, а один тег может быть связан с несколько элементов. НТН, Valve.

Ответ 5

Если пространство будет проблемой, у вас есть тег 3-й таблицы (Tag_Id, Title), чтобы сохранить текст для тега, а затем изменить таблицу тегов (Tag_Id, Item_Id). Эти два значения должны также предоставлять уникальный составной первичный ключ.

Ответ 6

Если вы не против использовать немного нестандартных материалов, Postgres версии 9.4 и выше имеет возможность хранить запись текстового массива JSON типа.

Ваша схема будет:

Table: Items
Columns: Item_ID:int, Title:text, Content:text

Table: Tags
Columns: Item_ID:int, Tag_Title:text[]

Для получения дополнительной информации см. этот отличный пост Джоша Беркуса: http://www.databasesoup.com/2015/01/tag-all-things.html

Существует множество различных опций, которые тщательно сравниваются с производительностью, и один из предложенных выше - лучший.

Ответ 7

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

Однако я бы предположил, что вы должны включить столбец Tag_ID в таблице тегов. Как правило, хорошая практика заключается в том, что каждая таблица имеет столбец идентификатора.

Ответ 8

Элементы должны иметь поле "ID", а теги должны иметь поле "ID" (первичный ключ, кластерный).

Затем создайте промежуточную таблицу ItemID/TagID и поставьте Perfect Index" там.