Я слышал о нескольких способах реализации тегов; использование таблицы соответствия между TagID и ItemID (имеет смысл, но масштабируется ли это?), добавление фиксированного количества возможных столбцов TagID к ItemID (кажется плохой идеей), сохранение тегов в текстовом столбце, разделенном запятыми (звучит сумасшедший, но может работать). Я даже слышал, что кто-то рекомендует разреженную матрицу, но как же тогда имена тегов растут изящно?
Я пропускаю лучшую практику для тегов?
sql
database-design
tags
data-modeling
tagging
dlamblin
источник
источник
Ответы:
Три таблицы (одна для хранения всех элементов, одна для всех тегов и одна для отношения между ними), должным образом проиндексированные, с установленными внешними ключами, работающими в соответствующей базе данных, должны работать хорошо и масштабироваться должным образом.
источник
Обычно я согласен с Яаковом Эллисом, но в этом особом случае есть другое жизнеспособное решение:
Используйте две таблицы:
Это имеет несколько основных преимуществ:
Во-первых, это значительно упрощает разработку: в решении с тремя таблицами для вставки и обновления
item
вы должны просмотретьTag
таблицу, чтобы увидеть, есть ли уже записи. Тогда вы должны присоединиться к ним с новыми. Это не тривиальная задача.Тогда это делает запросы проще (и, возможно, быстрее). Вам нужно выполнить три основных запроса к базе данных: вывести все
Tags
для одногоItem
, нарисовать облако тегов и выбрать все элементы для одного заголовка тега.Все теги для одного элемента:
3-таблица:
2-Таблица:
Облако тегов:
3-таблица:
2-Таблица:
Предметы для одного тега:
3-таблица:
2-Таблица:
Но есть и некоторые недостатки: это может занять больше места в базе данных (что может привести к увеличению количества дисковых операций, что медленнее), и это не нормализуется, что может привести к несоответствиям.
Аргумент размера не так силен, потому что сама природа тегов заключается в том, что они обычно довольно малы, поэтому увеличение размера невелико. Можно утверждать, что запрос для заголовка тега намного быстрее в небольшой таблице, которая содержит каждый тег только один раз, и это, безусловно, верно. Но если принять во внимание экономию, связанную с отсутствием необходимости присоединения, и тот факт, что вы можете построить для них хороший индекс, это может легко компенсировать это. Это, конечно, сильно зависит от размера базы данных, которую вы используете.
Аргумент о несостоятельности тоже немного спорный. Теги являются свободными текстовыми полями, и нет ожидаемой операции, такой как «переименовать все теги« foo »в« bar »».
Итак tldr: я бы пошел на решение двух столов. (На самом деле я собираюсь. Я нашел эту статью, чтобы увидеть, есть ли веские аргументы против этого.)
источник
Если вы используете базу данных, которая поддерживает map-Reduce, например couchdb, хранение тегов в текстовом поле или поле списка действительно является лучшим способом. Пример:
Выполнение этого с group = true сгруппирует результаты по имени тега и даже вернет счетчик количества раз, когда этот тег встречался. Это очень похоже на подсчет вхождений слова в тексте .
источник
Используйте один отформатированный текстовый столбец [1] для хранения тегов и используйте способную полнотекстовую поисковую систему для индексации этого. В противном случае вы столкнетесь с проблемами масштабирования при попытке реализовать логические запросы.
Если вам нужны подробности о имеющихся у вас тегах, вы можете либо отслеживать их в пошаговой таблице, либо запускать пакетное задание для извлечения информации.
[1] Некоторые СУБД даже предоставляют собственный тип массива, который может даже лучше подходить для хранения, не требуя шага синтаксического анализа, но может вызвать проблемы с полнотекстовым поиском.
источник
Я всегда держал теги в отдельной таблице, а затем имел таблицу сопоставления. Конечно, я никогда ничего не делал в действительно больших масштабах.
Наличие таблицы «тегов» и таблицы карт позволяет довольно просто создавать облака тегов и т. Д., Поскольку вы можете легко собрать SQL, чтобы получить список тегов со счетчиком частоты использования каждого тега.
источник
Я бы предложил следующий дизайн: Item Table: Itemid, taglist1, taglist2
это будет быстро и позволит легко сохранять и извлекать данные на уровне элемента.
Параллельно создайте еще одну таблицу: тег Tag не делает тег уникальным идентификатором, и если во 2-м столбце, который содержит свободное место, допустим, 100 элементов создают еще одну строку.
Теперь при поиске предметов по тегу это будет супер быстро.
источник