- Сообщения
- 167
- Реакции
- 117
Документация PostgreSQL – лучший источник знаний о СУБД. Но она отличается огромным объемом: не каждый разработчик осилит 3024 страницы формата А4. Опытный бэкендер составил список самых важных сведений, которые ему самому хотелось бы знать перед началом работы с PostgreSQL. Эта подборка сэкономит вам несколько недель изучения документации, и скорее всего, пригодится для работы с другими СУБД.
Мощь PostgreSQL сопровождается рядом особенностей, о которых важно знать. Автор публикации, на которой основана эта статья, подробно разобрал ключевые аспекты эффективной работы с PostgreSQL: нормализацию данных, поведение NULL, тонкости JSONB, индексацию, блокировки и улучшение вывода psql.
Нормализация данных
Суть нормализации в том, чтобы избавиться от дублирования и избыточности данных в базе. Представьте сайт, где пользователи могут загружать документы и получать уведомления на почту, когда кто-то просматривает их документы. Как правильно организовать такую базу данных?
Неправильный подход:
Следуйте рекомендациям разработчиков PostgreSQL
Разработчики PostgreSQL создали список «Не делайте этого» в официальной вики, который содержит важные рекомендации. Не все они будут понятны начинающему разработчику (и это нормально). Вот главные моменты:
Учитывайте особенности SQL
На самом деле вы можете писать то же самое строчными буквами:
Или даже смешанным стилем:
Это справедливо не только для PostgreSQL, но и для других SQL баз данных.
Практически все обычные операторы сравнения при работе с NULL возвращают NULL. Чтобы вернуть true/false, используют специальные операторы:
Важнo заметить, что WHERE выбирает только строки, где условие возвращает true. Например, этот запрос НЕ вернет строки, где title равен NULL:
Это происходит потому, что NULL != 'manager' возвращает NULL, а не true или false.
Другая важная функция для работы с NULL – COALESCE. Она принимает несколько аргументов и возвращает первое не-NULL значение из списка:
Используйте возможности psql
При желании можно использовать любую строку, даже эмодзи, например
как индикатор NULL. Чтобы сделать эту настройку постоянной, создайте файл .psqlrc в домашней директории ~/.psqlrc и добавьте в него строку
Эти команды – лишь верхушка айсберга. В psql есть множество других сокращений, которые значительно упрощают работу с базами данных. Попробуйте команду \?, чтобы увидеть полный список.
Если нужно, чтобы в первой строке файла были указаны названия колонок таблицы, добавьте опцию HEADER:
GROUP BY и ORDER BY позволяют ссылаться на столбцы не только по имени, но и по их порядковому номеру в списке SELECT. Например, тот же запрос можно записать так:
Однако не рекомендуется использовать эту практику в продакшене.
Мощь PostgreSQL сопровождается рядом особенностей, о которых важно знать. Автор публикации, на которой основана эта статья, подробно разобрал ключевые аспекты эффективной работы с PostgreSQL: нормализацию данных, поведение NULL, тонкости JSONB, индексацию, блокировки и улучшение вывода psql.
Нормализация данных
Суть нормализации в том, чтобы избавиться от дублирования и избыточности данных в базе. Представьте сайт, где пользователи могут загружать документы и получать уведомления на почту, когда кто-то просматривает их документы. Как правильно организовать такую базу данных?
Неправильный подход:
- Хранить email пользователя прямо в таблице документов для каждого загруженного файла
- Проблема: если пользователь захочет изменить свой email, придется обновлять его во всех сотнях записей с документами
- Создать отдельную таблицу пользователей с их данными (включая email).
- В таблице документов хранить только ID пользователя (внешний ключ).
- При изменении email меняем его только в одном месте.
- Каждый раз суммировать длительность всех смен (это медленно).
- Или хранить готовую сумму, обновляя ее при изменениях (гораздо быстрее).
- Появляется риск несогласованности данных.
- Усложняется процесс обновления данных.
Следуйте рекомендациям разработчиков PostgreSQL
Разработчики PostgreSQL создали список «Не делайте этого» в официальной вики, который содержит важные рекомендации. Не все они будут понятны начинающему разработчику (и это нормально). Вот главные моменты:
- Для хранения текста всегда используйте тип данных text. Это универсальное решение для любого текстового контента. Не нужно беспокоиться о максимальной длине – PostgreSQL эффективно обрабатывает тип text независимо от размера данных.
- Для хранения временных меток используйте timestamptz или time with time zone. Эти типы автоматически учитывают часовые пояса, обеспечивают корректную работу с данными из разных временных зон и помогают избежать проблем с переходом на летнее/зимнее время.
- Называйте таблицы в стиле snake_case – используйте нижний регистр, разделяйте слова подчеркиваниями: user_profiles, payment_transactions, order_items и т. д.
Учитывайте особенности SQL
Регистр запросов
В SQL регистр ключевых слов не имеет значения. То есть, когда вы видите в документации и учебниках SQL-запросы, написанные заглавными буквами, например:
Код:
SELECT * FROM my_table WHERE x = 1 AND y > 2 LIMIT 10;
На самом деле вы можете писать то же самое строчными буквами:
Код:
select * from my_table where x = 1 and y > 2 limit 10;
Или даже смешанным стилем:
Код:
SELECT * from my_table WHERE x = 1 and y > 2 LIMIT 10;
Это справедливо не только для PostgreSQL, но и для других SQL баз данных.
NULL в SQL
NULL в SQL существенно отличается от null/nil в других языках программирования. В SQL NULL лучше понимать как «неизвестное значение». NULL обладает несколькими неожиданными особенностями: например, сравнение NULL = NULL возвращает NULL (а не true, поскольку SQL не может знать, равны ли два неизвестных значения).Практически все обычные операторы сравнения при работе с NULL возвращают NULL. Чтобы вернуть true/false, используют специальные операторы:
| x IS NULL | вернет true, если x это NULL (false в обратном случае) |
| x IS NOT NULL | вернет true, если x это не NULL (false в обратном случае) |
| x IS NOT DISTINCT FROM y | работает как =, но корректно обрабатывает NULL |
| x IS DISTINCT FROM y | работает как !=, но корректно обрабатывает NULL |
Код:
SELECT * FROM users WHERE title != 'manager'
Другая важная функция для работы с NULL – COALESCE. Она принимает несколько аргументов и возвращает первое не-NULL значение из списка:
Код:
COALESCE(NULL, 5, 10) = 5
COALESCE(2, NULL, 9) = 2
COALESCE(NULL, NULL) IS NULL
Используйте возможности psql
Как сделать вывод psql более удобным для чтения
Когда вы делаете запрос к таблице со множеством столбцов или длинными значениями, вывод часто становится нечитаемым. Это потому, что вы не используете терминальный пейджер. Пейджер позволяет просматривать текст, прокручивая его в окне терминала. less – стандартный пейджер в Unix-подобных системах. Для использования less как пейджера по умолчанию добавьте в ваш ~/.bashrc или ~/.zshrc:
Код:
# Опция -S предотвращает перенос длинных строк
export PAGER='less -S'
Расширенный режим вывода
Таблицы со множеством столбцов неудобно просматривать, даже если данные идеально отформатированы. В этом случае можно включить расширенный режим командой \pset expanded или коротко \x. Чтобы включить этот режим по умолчанию, создайте файл ~/.psqlrc и добавьте туда команду \x. При каждом запуске psql все команды из этого файла будут выполняться автоматически.Как сделать значения NULL более заметными
Когда в таблице встречается значение NULL, по умолчанию оно отображается просто как пустое место, что может приводить к путанице. Чтобы решить эту проблему, можно настроить специальное отображение NULL-значений. Для этого выполните команду в консоли psql:
Код:
\pset null '[NULL]'
При желании можно использовать любую строку, даже эмодзи, например
\pset null '[NULL]'.Автодополнение
psql имеет встроенную функцию автодополнения, которая значительно ускоряет работу. Начните вводить SQL-команду или имя таблицы, нажмите клавишу Tab – psql автоматически дополнит строку:
Код:
-- начните печатать "SEL"
SEL
-- ^ нажмите `Tab`
SELECT
Сокращенные команды
В psql есть множество удобных команд, которые начинаются с обратного слэша \. Эти команды помогают быстро находить информацию, редактировать запросы и выполнять другие полезные действия. Вот основные из них:| \? | Показывает список всех доступных команд. |
| \d | Показывает список объектов (таблиц и последовательностей) вместе с их владельцами. |
| \d+ | То же, что и \d, но дополнительно показывает размер объектов и дополнительную метаинформацию. |
| \d table_name | Показывает структуру таблицы: список столбцов (с их типами, допускаемостью NULL и значениями по умолчанию), а также индексы и внешние ключи. |
| \e | Открывает ваш текстовый редактор (по умолчанию тот, что указан в переменной окружения $EDITOR) для редактирования SQL-запроса. |
| \h SQL_KEYWORD | Показывает синтаксис для указанного SQL-ключевого слова (например, SELECT, INSERT) и ссылку на документацию. |
Эти команды – лишь верхушка айсберга. В psql есть множество других сокращений, которые значительно упрощают работу с базами данных. Попробуйте команду \?, чтобы увидеть полный список.
Запись результата выполнения запроса в CSV
В PostgreSQL можно легко сохранить результат выполнения любого запроса в CSV-файл:
Код:
\copy (select * from some_table) to 'my_file.csv' CSV
Если нужно, чтобы в первой строке файла были указаны названия колонок таблицы, добавьте опцию HEADER:
Код:
\copy (select * from some_table) to 'my_file.csv' CSV HEADER
Сокращения и псевдонимы
В psql можно использовать сокращения и псевдонимы (алиасы) для упрощения работы с выводом запросов и их организации. Например, с помощью ключевого слова AS можно задать любое название для столбца в выводе:
Код:
SELECT vendor, COUNT(*) AS number_of_backpacks FROM backpacks GROUP BY vendor ORDER BY number_of_backpacks DESC;
GROUP BY и ORDER BY позволяют ссылаться на столбцы не только по имени, но и по их порядковому номеру в списке SELECT. Например, тот же запрос можно записать так:
Код:
SELECT vendor, COUNT(*) AS number_of_backpacks FROM backpacks GROUP BY 1 ORDER BY 2 DESC;
Однако не рекомендуется использовать эту практику в продакшене.