Каков наиболее эффективный способ хранения тегов в базе данных?
Я внедряю систему тегов на своем веб-сайте, похожую на одно использование 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" там.