Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
 Как хранить и индексировать тэги  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
Всем привет!

Ситуация следующая - для каждой записи в таблице нужно хранить набор текстовых тэгов - обычно 2-3 штуки, но некоторым нужно 5-6.
Создавать колонки tag1, tag2, ...tagN пока не хочется.

Решение в лоб - хранить тэги в отдельной колонке как varchar строку в которой тэги записаны через пробел, запятую, точку с запятой...
Но тогда вопрос - как индексировать такое поле, чтобы селекты были быстры и точны :)
Насколько я знаю запросы LIKE + метасимволы во многих БД очень неторопливы, но может я ошибаюсь.

Использую PostgreSQL 11.
14 авг 19, 20:37    [21949616]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
SERG1257
Member

Откуда:
Сообщений: 2663
Решением в лоб здесь будет
create table tags (id int primary key, id_From_parent_table references parent table, tag_text varchar)
14 авг 19, 20:48    [21949626]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
SERG1257
Решением в лоб здесь будет
create table tags (id int primary key, id_From_parent_table references parent table, tag_text varchar)

Спасибо за ответ.
А что делать если у меня таких таблиц (с основными записями) несколько, плюс они секционированные, плюс в дальнейшим будут добавляться новые таблицы?
Твой вариант конечно хороший и соответствует самой идее реляционных БД, но хочется избежать создания дополнительных таблиц там, где это возможно.
Создать табличку - ерунда, дело 30 минут, но потом поддерживать такой зоопарк будет довольно накладно :)
14 авг 19, 21:07    [21949636]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
SERG1257
Member

Откуда:
Сообщений: 2663
sdkmaster
но хочется избежать создания дополнительных таблиц там, где это возможно.
Избегайте. Каждый сам кузнец своего геморроя.
sdkmaster
потом поддерживать такой зоопарк будет довольно накладно :)
Поддерживайте костылевелосипед. Вряд ли будет дешевле.
14 авг 19, 21:29    [21949639]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
SERG1257
sdkmaster
но хочется избежать создания дополнительных таблиц там, где это возможно.
Избегайте. Каждый сам кузнец своего геморроя.
sdkmaster
потом поддерживать такой зоопарк будет довольно накладно :)
Поддерживайте костылевелосипед. Вряд ли будет дешевле.

Почему же сразу костылевелосипед :)

Тэги не самая важная вещь, основной поиск, 80-90% всех запросов, будет вестись по другим полям, которые хорошо проиндексированы.
Но для некоторых запросов, примерно 10-20%, нужен поиск именно по тэгам.
Поэтому и спрашиваю насчет организации - как сделать лучше, но так чтобы не создавать лишнюю таблицу.

Ничего страшного, что придется хранить все тэги в одной строке и пить кофе пока select+like сделают свою работу.
Но если есть рецепт получше, а я уверен что форумчане с подобным уже сталкивались, то буду ему очень рад.
14 авг 19, 21:57    [21949649]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
Можно описать задачу по-другому - "как сделать быстрым select для поиска подстроки в строке".
Возможно есть какие-то джедайские техники или секретное шаолиньское искусство построения индекса для строк.
Если все что нам доступно, это like+метасимволы, то грустно.
14 авг 19, 22:10    [21949658]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
SERG1257
Member

Откуда:
Сообщений: 2663
sdkmaster
есть какие-то джедайские техники или секретное шаолиньское искусство построения индекса для строк.
Делайте вычисляемые поля tag1, tag2, ...tagN которые будут вычислятся из строки через запятую и их индексируете.

Будет ли это лучше - не факт, зато таблицу создавать не надо.
14 авг 19, 22:23    [21949664]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48131

sdkmaster
Возможно есть какие-то джедайские техники или секретное шаолиньское искусство построения
индекса для строк.

Full Text Search.

Posted via ActualForum NNTP Server 1.5

15 авг 19, 00:16    [21949704]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 19310
Разбить строку с тэгами на части и класть это всё в недоEAV. Потребуется две таблички. Поиск будет по значению тэга не как like, а как обычное сравнение. Индекс по имени тэга позволит сэкономить на чае и кофе.
15 авг 19, 08:44    [21949767]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 780
sdkmaster,

в Постгресе есть ещё нечёткий поиск через триграммные индексы. Можно эту тему посмотреть.
15 авг 19, 10:41    [21949860]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
sdkmaster, в Postgresql хорошо оптимизирован тип JSONB. Если вы построите по нему индекс
то поиск по нужным атрибутам документа будет достаточно быстрым. На уровне MongoDb.

Положите в JSONB ваши теги.
19 авг 19, 16:24    [21952654]     Ответить | Цитировать Сообщить модератору
 Re: Как хранить и индексировать тэги  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3048
можешь посмотреть [url=]моё видео [/url] по этому поводу и решить
22 авг 19, 21:18    [21956010]     Ответить | Цитировать Сообщить модератору
Все форумы / Проектирование БД Ответить