SQL Portal | Базы Данных
14.6K subscribers
721 photos
95 videos
41 files
582 links
Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных

Связь: @devmangx

РКН: https://clck.ru/3H4Wo3
Download Telegram
Простое объяснение Primary Key и Foreign Key в SQL:

Primary Key (PK) это уникальный идентификатор записи в таблице. В таблице customers поле customer_id является первичным ключом. Каждому клиенту присваивается уникальный номер, и два клиента не могут иметь одинаковый ID. Sarah Johnson всегда будет клиентом с ID 1001, а если завтра зарегистрируется другая Sarah Johnson, ей дадут другой ID. Это помогает организовать данные и избежать путаницы.

Foreign Key (FK) это связь между таблицами, как мост. В таблице orders поле customer_id является внешним ключом. Здесь он не уникален, потому что один клиент может сделать несколько заказов. Например, Sarah (customer 1001) сделала два заказа — на ноутбук и на клавиатуру. Внешний ключ customer_id в таблице orders ссылается на первичный ключ в таблице customers.

Без внешнего ключа пришлось бы хранить имя и email Сары в каждой записи заказа, что создаёт хаос и занимает лишнее место. Используя FK, данные клиента хранятся один раз в таблице customers, а в таблице orders просто ссылаются на него через ID. Это делает систему чистой, эффективной и масштабируемой.

PK уникально идентифицирует запись, а FK соединяет связанные данные между таблицами.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍95
В Postgres 18 появились виртуальные вычисляемые колонки

Если убрать ключевое слово stored в определении, колонка не будет храниться на диске, а будет вычисляться на лету.

Это экономит место и не замедляет записи, но может замедлять чтение, так что использовать стоит с умом.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍4
Получение значений из первой, N-й и последней строки:

FIRST_VALUE ⇒ первая
NTH_VALUE ⇒ N-я
LAST_VALUE ⇒ последняя

По умолчанию окно заканчивается на текущей строке ⇒

NTH_VALUE(v, N) возвращает NULL для строк до N
LAST_VALUE возвращает последнее значение с тем же sort key, а не из самой последней строки

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Карен Джекс поделилась свежим материалом о партиционировании в Postgres.

Ранее она выступила с этим докладом на Euroko, а теперь опубликовала подробный блог с разбором примера и практическими рекомендациями по эффективному использованию партиционирования.

https://karenjex.blogspot.com/2025/09/postgres-partitioning-best-practices.html

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Pro-tip по дизайну БД: Soft Deletes

Soft delete — вместо того чтобы физически удалять строку, мы помечаем её как удалённую (например, deleted_at TIMESTAMP).

Плюсы:
- удобно для undo (отката);
- хранение истории ;
- не ломаются внешние ключи.

Но! 🚬

Если напрямую писать запросы к таблице, половина кода будет забывать исключать «удалённые» строки. В итоге поведение приложения становится непредсказуемым и разъезжается в разных местах.

Решение

Всегда создавай view, которое сразу фильтрует «живые» строки.

CREATE VIEW users_active AS
SELECT * FROM users WHERE deleted_at IS NULL;


Разработчики по умолчанию работают именно с view, а к базовой таблице обращаются только когда реально нужны «удалённые» данные.

Делай «безопасный путь» простым и привычным.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥52
Автоматизируйте задачи в Postgres с помощью pg_cron. Этот инструмент позволяет по расписанию запускать простые задачи, например VACUUM или пересборку материализованных представлений.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍4🔥3
Чтобы кешировать результаты вызовов функций в PL/SQL, объявляйте их с модификаторами:

DETERMINISTIC ⇒ кеширование в пределах одного SQL-выражения

RESULT_CACHE ⇒ кеширование между сессиями

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

https://mikesmithers.wordpress.com/2022/10/16/deterministic-and-result_cache-pl-sql-functions/

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42
Совет по Postgres для тестирования расширений:

Можно использовать команду LOAD, чтобы подгрузить общие библиотеки только в рамках текущей сессии, вместо изменения shared_preload_libraries и перезапуска Postgres.

LOAD 'auto_explain';
LOAD 'pg_stat_statements';


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
Индексируйте скалярные значения в массивах JSON, хранящихся в Oracle Database, с помощью

CREATE MULTIVALUE INDEX ... ON t ( t.json_data.array.<type> )


Оптимизатор может использовать такие индексы при поиске по массиву с помощью

JSON_EXISTS ( t.json_data, '$.array?(@.<type> == ... )' )


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
Где разместить базу данных бесплатно

Актуальные бесплатные платформы на сегодня ↓

🟢MongoDB Atlas
MongoDB — 512 МБ, автоматические бэкапы
mongodb.com

🟢Neon Tech
PostgreSQL — 500 МБ, 190 часов вычислений
neon.tech

🟢FreeDB Tech
MySQL — 25 МБ, максимум 200 подключений
freedb.tech

🟢Turso
SQLite — 5 ГБ, до 500 миллионов чтений
turso.tech

🟢Upstash
Redis — 256 МБ, 500 000 команд
upstash.com

🟢Xata
PostgreSQL — 15 ГБ, безлимитный трафик
lite.xata.io

🟢Supabase
PostgreSQL — 500 МБ, 5 ГБ трафика
supabase.com

🟢CockroachDB
10 ГБ хранилища, 50 млн запросов
cockroachlabs.com

🟢Koyeb
PostgreSQL — 1 ГБ, 5 часов выполнения
koyeb.com

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Как добиться index-only scan в Postgres?

Используйте covering indexes (покрывающие индексы).

SELECT name, email FROM web_users WHERE id = 123;


Этот запрос можно полностью покрыть индексом:

CREATE INDEX idx_users_includes
ON web_users (id)
INCLUDE (name, email);


Так Postgres сможет получить все нужные данные прямо из индекса, не обращаясь к таблице.

Хотите логировать действительно долгие запросы?

Можно настроить auto_explain так, чтобы он логировал только запросы, превышающие заданное время выполнения:

auto_explain.log_min_duration = '1000ms';


Это позволит автоматически сохранять планы выполнения только для запросов, которые работают дольше 1 секунды.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍7
Скрытые возможности PostgreSQL

В материале автор делится пятью возможностями, о которых редко говорят в сообществе PostgreSQL. Среди них — GRANT SELECT, DISTINCT ON, ограничения EXCLUDE и другие интересные приемы.

Читать статью: тык

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
На GitHub опубликован бесплатный «6-недельный дорожный план по SQL для Data Science / аналитики»

Проект предлагает по неделе на ключевые темы: основы SQL и SELECT, агрегаты и GROUP BY, JOIN-ы, оконные функции, CTE и подзапросы, а затем — самостоятельные проекты для закрепления навыков 😎

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
7
На официальной вики PostgreSQL опубликована статья “Don’t Do This”, где собраны типичные ошибки при работе с базой данных и объясняется, почему их стоит избегать

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Инструмент командной строки для мониторинга активности сервера PostgreSQL

https://github.com/dalibo/pg_activity

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
Использую Beekeeper Studio больше полугода и это самый удобный и красивый бесплатный менеджер баз данных, с которым мне доводилось работать. Приятен интерфейс, удобные горячие клавиши, интуитивная навигация, а подсветка и подтверждение перед удалением файлов делают работу безопасной.

Бесплатная версия покрывает большинство нужных функций, подписка не нужна. Рекомендую всем попробовать. 😎

GitHub: beekeeper-studio

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
6💊3
This media is not supported in your browser
VIEW IN TELEGRAM
В Oracle SQL вы можете вычесть один год из даты с помощью одного из вариантов:

ADD_MONTHS(dt, -12)

- INTERVAL '1' YEAR


Но будьте внимательны — они по-разному обрабатывают 29 февраля:

ADD_MONTHS → 29 февраля преобразуется в 28 февраля предыдущего года

INTERVAL → 29 февраля преобразуется в 29 февраля предыдущего года → ошибка!

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍65
Интересный факт про vector search: проверка меньшего объёма данных делает поиск быстрее и точнее.

Алгоритм HNSW это основа одних из самых быстрых векторных поисков. Если вы использовали Weaviate или другие векторные базы, вы уже сталкивались с HNSW, это стандартный тип индекса, и не случайно.

HNSW можно представить как многоуровневую транспортную систему для векторов: сверху —> редкие длинные связи для глобальной навигации, средний уровень —> средние связи для регионального поиска, низкий уровень —> плотные связи для всех векторов для точного результата. Поиск начинается сверху, постепенно уточняется на каждом слое и в конце достигает максимальной точности на нижнем уровне. Алгоритм «перепрыгивает» через множество неактуальных данных вместо проверки каждого вектора, что делает его быстрее brute-force методов.

Основные параметры, которые можно настраивать:
• maxConnections —> плотность графа; большее значение повышает точность, но замедляет поиск и требует больше памяти
• ef, efConstruction —> динамический размер списков для поиска и построения графа, влияющий на баланс между скоростью и точностью

HNSW это баланс между скоростью, точностью и расходом памяти; улучшение одного всегда требует компромисса с другими.

Подробнее о настройке HNSW и оптимизации: Weaviate docs

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🌭4🤔1
Совет для PostgreSQL: используйте NULLS LAST или NULLS FIRST в ORDER BY, чтобы управлять расположением NULL‑значений в результатах запроса.

Пример:

SELECT order_id, product_name
FROM orders
ORDER BY order_date DESC NULLS FIRST;


В этом случае строки с NULL в order_date окажутся в начале результата.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥5
Делаешь ли ты эти типичные ошибки в SQL?

Забываешь про NULL
Обрабатываешь данные в памяти Java
Используешь JDBC-пагинацию для больших выборок
Применяешь агрегатные функции вместо оконных

Лукас Эдер объясняет, как делать правильно — и приводит ещё 7 распространённых ошибок.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8
onedump позволяет создавать резервные копии и восстанавливать базы данных MySQL и PostgreSQL на локальном компьютере, S3, Google Drive, Dropbox или SFTP с помощью одного инструмента.

https://github.com/liweiyi88/onedump

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥5