Postgres — Don't Do This
https://wiki.postgresql.org/wiki/Don%27t_Do_This
Список антипаттернов из официальной вики PostgreSQL. Простыми словами:
1. SQL_ASCII — база складывает байты без проверки, получается каша из кодировок, которую не разобрать. Берите UTF-8.
2. psql -W / --password — спрашивает пароль даже когда он не нужен, путает диагностику доступа. psql сам спросит, если надо.
3. RULE — выглядит как логика, а молча переписывает запрос; все нетривиальные правила неверны. Нужен побочный эффект — триггер.
4. Наследование таблиц — мода на «БД как объекты», не взлетела. Связи — внешними ключами.
5. NOT IN — с NULL всегда 0 строк; с подзапросом планировщик не делает anti-join, получается квадратичный перебор и падение скорости в тысячи раз на росте данных. Пишите NOT EXISTS.
6. Имена MyTable — без кавычек всё приводится к нижнему регистру, с кавычками нет; вечные «no such table». Пишите my_table.
7. BETWEEN с timestamp — включает обе границы, ровно полночь считается дважды. Пишите >= начало AND < конец.
8. timestamp без зоны — это «фотография часов», а не момент времени; арифметика через переход на летнее время врёт. Берите timestamptz.
9. UTC в timestamp without time zone — база не знает, что это UTC, и любой расчёт превращается в цепочку AT TIME ZONE.
10. timetz и CURRENT_TIME — время с зоной без даты бессмысленно. Берите now() / CURRENT_DATE / LOCALTIMESTAMP.
11. timestamp(0) — округляет, а не отрезает, время «уезжает» вперёд. Нужна секунда — date_trunc('second', x).
12. char(n) — добивает пробелами, тратит место, не быстрее и странно сравнивается. Даже для кодов стран: text + CHECK(length(...)=3).
13. varchar(255) по привычке — text занимает ровно столько же и не медленнее; случайный лимит однажды уронит прод. Лимит — только осознанно.
14. money — не хранит валюту (зависит от настройки lc_monetary), не умеет доли цента, округляет не так. Берите numeric + колонку валюты.
15. serial — устаревшая автонумерация с неудобными зависимостями и правами. В новом коде — GENERATED AS IDENTITY.
16. trust-аутентификация по TCP/IP — сервер верит на слово, кем вы представились. host all all 0.0.0.0/0 trust = любой из интернета входит суперпользователем. Только scram-sha-256.
Проверить свою схему автоматически: schemalint — https://github.com/kristiandupont/schemalint
Post #1286
176
- 🫡 3
- 👍 2