Как сделать не виснующее ноукод приложение с БД в 1000000 строк?
Продолжаем говорить о SQL и сегодня разберем полезные советы о работе с SQL в Bubble.
Ранее я уже делал ряд постов об этом, поэтому не будем повторяться и посмотрим новые инсайты.
1️⃣ Для подключение к Supabase устанавливаем плагин SQL Connector и берем креды из Settings - Database. Далее формируем строку для плагина - postgres://User:Password@Host:Port/Database.
- Пример: postgres://postgres:YGe24reS51Sba@db.ekgfdgwertwerajnwqw.supabase.co:5432/postgres
2️⃣ Работая с большим объемом данных не обойтись без пагинации - ее можно сделать с помощью OFFSET и переменной ($1). Для показа следующей “страницы” добавьте к переменной число, указанное у вас в LIMIT. При пагинации обязательна сортировка данных, чтобы БД точно понимать какие именно записи идут следующими.
- ORDER BY created_date DESC LIMIT 200 OFFSET $1;
3️⃣ Переменные в запросах:
- При составлении запроса заранее задумайтесь о переменных, которые вы будете использовать в нем. Если вы захотите удалить переменную, то порядок всех остальных переменных сместиться, поэтому лучше просто заменять ненужную переменную на последнюю в списке.
- Если вам нужно сделать запрос для поиска с различными фильтрами (переменными), которые могут быть пустыми, добавьте в условие проверку переменной - $1 IS NULL. Примеры условий для разных типов:
- - Текстовая переменная - (status LIKE '%' $1 '%' OR $1 IS NULL)
- - Числовая переменная - (telegram_id = $1 OR $1 IS NULL)
- - Массив - school_name = ANY(ARRAY[$1] OR $1 IS NULL) - $1=‘Harvard,Stanford’
- Если у вас есть проблемы с типом данных на стороне Bubble, смените тип переменной в SQL - $1::text или $1::int
4️⃣ Не бойтесь SQL, за меня на нем пишет ChatGPT. Даже 3.5 версии достаточно скормить структуру ваших таблиц (Table - Definition) и он сам напишет все нужные запросы за вас.
🔥Совет со звездочкой для самых-самых:
Кейс - я хочу выбрать из списка заказ и показать детали этого заказа.
Источником данных для карточки деталей заказа я использую выбранную запись из общего списка заказов, который основан на запросе get_orders. Тут нет проблем - жмем на заказ и используем This get_orders.
Но каждый запрос воспринимается как отдельный тип данных. Если я хочу из карточки счета перейти в заказ мне нужно либо использовать отдельный запрос get_this_order, либо брать весь список заказов и фильтровать его на стороне клиента, чтобы получить данные по конкретному заказу.
Первый способ вернет другой типа данных, который нельзя использовать для карточки товара (у нас там все завязано на get_orders). Второй же способ небезопасен (так как грузятся все данные на сторону клиента) и неэффективен (это может занять очень много времени). Что же делать?
Мы делаем универсальный запрос get_orders, куда добавляем еще один фильтр id=$1. Проблема в том, что UUID это жесткий 32 символьный формат и при попытке отправки пустой строки вы получите ошибку ($1 IS NULL тоже не поможет). Для обхода этой проблемы мы заменяем дефолтное пустое значение на валидный UUID и меняем условие. (id = $4 OR $4= '00000000-0000-0000-0000-000000000000’)
Спасибо вам, за то что читали мой блог весь этот год. ❤️🔥
Поздравляю всех с наступающим Новым Годом🎄, ставьте лайки и подписывайтесь, в следующем году дело примет серьезные обороты!
Post #99
1.02K