Database First! О распространённых ошибках использования РСУБД
Николай Самохвалов (Postila) сделал доклад на HighLoad Junior о распространенных ошибках при использовании РСУБД.
В докладе в основном идет речь о PostgreSQL. MySQL и MariaDB удостоились лишь пары критических слов.
Тезисы:
- Неиспользование базовых возможностей SQL - большая глупость, которая приводит к неэффективным системам, плохим данным, ошибкам и т.д.
- Часто не используется контроль данных (ограничение целостности типа данных) и манипуляция ими.
- За редким исключением обязательное наличие primary key. Его отсутствие - это нарушение реляционной модели, что приводит к аномалиям данных.
- Суррогатные ключи - это иллюзия правильного проектирования, легко забыть о потенциальных ключах.
- Не используются foreign keys. Как следствие: осиротевшие записи, ошибки 404, 500. Вычищать долго и дорого.
- Не используется NOT NULL. Неполные данные, бессмысленные записи, аномалии.
- Не используется встроенная проверка данных (например, что значение больше ноля). Мусор, некорректные данные.
- Недостаточно продуманные типы данных и их размер. Например: слишком большой varchar. Дешевле увеличить, чем уменьшить. Для email указание varchar вместо citext и отсутствие lower()
- Не нужно делать проверку данных только в приложении. С его ростом начнутся проблемы. Другие клиенты обращающиеся к базе смогут писать туда некорректные данные. Проверки должны быть как можно ближе к данным.
- В PostgreSQL так же можно делать проверки и для неструктурированных данных JSON(b)
- В MySQL с валидацией данных все плохо (даже в 8 версии) “The CHECK clause is parsed but ignored by all storage engines.”
- В MariaDB с этим получше, но не на много. Проверки нельзя добавить или изменить (на момент написания поста, выделенная на слайде строка, с информацией об этом, отсутствует в официальной документации), только удалить.
- Манипулировать данными можно средствами БД, а не перекладывать это на приложение.
В докладе приводятся примеры кода, ссылки на интересные материалы и небольшой чек-лист для проверки вашей базы.