powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / тип text как кэш для конкретной записи
20 сообщений из 20, страница 1 из 1
тип text как кэш для конкретной записи
    #39738288
Толикman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Пишу небольшой бот, и столкнулся с проблемой - где хранить произвольный контекст в формате json.
Хочу его запихать в колонку text рядом с записью соответствующего собеседника.

Таким образом при каждом сообщении это поле может перезаписываться - космоса там не будет, вряд ли выйдет за 500 символов, чаще будет 10-50 символов.

Но я в postgresql новичок, и не могу найти очевидных ответов на то, как БД будет вести себя в случае частого update по полю с типом text значениями переменной длины.

Не начнет ли у меня раздуваться база из-за частого устаревания старых значений в пользу записи новых?
Подскажите пожалуйста, как лучше поступить?
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738378
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Толикman, лучше вообще не использовать СУБД для подобных задач.
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738384
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Scott Tiger,

СУБД СУБД тут рознь.
В Oracle с каждый раз физическим обновлением этой строки, все будет в порядке.
А в PG настроить вакуум поагрессивнее, и все опять в порядке. Не?
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738388
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hawkmoon, дело тут не в особенностях СУБД, хотя, конечно, постргес на постоянных апдейтах одной строки даст жару :) Но СУБД для такой задачи - лютый оверкилл. Как следствие, получим повышенное потребление ресурсов, дополнительные зависимости, потребность в дополнительных компетенциях эксплуатанта, дополнительные риски, в т.ч. ввиду отсутствия должных компетенций, ну и т.д и т.п. Если стоит задача хранить "контекст" постоянно - я бы сделал на текстовых файлах в ФС, если "контекст" после ребута не нужен - вообще хранил бы в памяти приложения.
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738460
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Scott Tiger,

Ну вот и ответы на оба вопроса ТС
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738550
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТоликmanПишу небольшой бот, и столкнулся с проблемой - где хранить произвольный контекст в формате json.
Хочу его запихать в колонку text рядом с записью соответствующего собеседника.

внезапно в постгресе есть типы json и jsonb, которые предназначены для хранения json
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738555
Толикman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Karbafos,

я видел такой тип, но так же не нашел то, как он будет храниться.
Этот тип лишен таких проблем как text в части съедания места из-за частой перезаписи? (без настроек vacuum)
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738558
Толикman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Scott Tiger,

Спасибо за разъяснения!

Правда вопросов только увеличилось...
ну а если пользователей будет 1 000, а если 10 000 ? хранить все в файлах?
Я думаю, что БД должна решить вопросы быстрого доступа к нужным данным лучше, чем файловая система...

Просто при написании бота нет такого понятия - как сессия, и поэтому надо эту самую сессию реализовать самому.
Храня в ней контекст, но только на стороне сервера. И это однозначно БД. Срок хранения может быть разным, от нескольких секунд до десятков минут.

Я возможно не прав, но пока не увидел альтернативного решения.
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738582
Толикman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или лучше так:

вообще реализовать отдельную таблицу для кэша (с json) с автовакуумом и fillfactor 50,
в качестве primary key взять значения primary key таблицы юзеров (без внешних ключей),
При каждой выдаче джоинить юзера с его кэшем.
Неактуальный кэш удалять раз в сутки.

Такое решение имеет место быть адекватным?
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738603
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТоликmanТакое решение имеет место быть адекватным?
Никакое решение, включающее в себя json не может быть адекватным по определению.
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738638
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hawkmoon
Ну вот и ответы на оба вопроса ТС



Только неправильные.
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738644
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ваше утверждение само неадекватное.

Тип JSON вместо TEXT полезен, если нужно делать поиск в базе по элементам JSON. TEXT подходит, чтобы просто хранить.

Поскольку ни один знаток PostgreSQL не высказался, то отмечу, что я сам применяю тип text для большинства текстовых полей, и не наблюдаю излишнего расхода места на диске или необходимости частого VACUUM из-за этого.
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738650
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan M,

Это же специалист по Delphi и Firebird. Он точно знает толк в адекватности, в 2018 году.
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738653
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan MHawkmoonНу вот и ответы на оба вопроса ТС



Только неправильные.

Критикуешь - предлагай (с)

Мне тоже не нравится идея 1000 апдейтов в час у одной строки в Pg. В Oracle - норм, но для ботостроителя Oracle неприменим по другим причинам.
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738676
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТоликmanKarbafos,

я видел такой тип, но так же не нашел то, как он будет храниться.
Этот тип лишен таких проблем как text в части съедания места из-за частой перезаписи? (без настроек vacuum)

у тебя что, 300к в секунду перезаписей, что так беспокоишься о допнастройках автовакуума?

если кратко
json хранится as is, но более тупой
jsonb хранится в бинарном виде, может быть проиндексирован всякими типами индексов
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39738929
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Толикman, пара вопросов:

1. Сессия, которую Вы хотите хранить до нескольких десятков минут, должна ли быть доступна с других экземпляров приложения? Или проще: у Вас кластер серверов обеспечивает работу этого бота или один сервер?

2. При перезапуске сервера нужно ли сохранять состояние сессии на постоянном хранилище (диске, СУБД и т.п.) или его можно потерять без вреда?
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39739165
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan MТип JSON вместо TEXT полезен, если нужно делать поиск в базе по элементам JSON.
Если по элементам JSON нужен поиск, то данные из него следует раскладывать непосредственно в базу, а не закапывать в плохо структурированную братскую могилу.
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39742590
Толикman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Scott Tiger,

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

авторПри перезапуске сервера нужно ли сохранять состояние сессии на постоянном хранилище (диске, СУБД и т.п.) или его можно потерять без вреда?
Лучше хранить, меньше проверок в коде придется делать. Но если это значительно облегчит существование, то можно и восстанавливать кэши.
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39742596
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Толикman, я бы просто в памяти тогда хранил. Ну или что-то совсем примитивное типа Redis использовал, если уж очень хочется (но зачем?).
...
Рейтинг: 0 / 0
тип text как кэш для конкретной записи
    #39742610
Толикman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Scott Tiger,

огромное спасибо!
Redis - то что доктор прописал.

У меня работают два изолированных скрипта (один для вебхуков, второй параллельно сам инициирует коммуникации), и мне нужен такой посредник, который и будет кэшем заниматься... Redis самое то - не сталкивался еще с ним.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / тип text как кэш для конкретной записи
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]