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 с этим получше, но не на много. Проверки нельзя добавить или изменить (на момент написания поста, выделенная на слайде строка, с информацией об этом, отсутствует в официальной документации), только удалить.
  • Манипулировать данными можно средствами БД, а не перекладывать это на приложение.

В докладе приводятся примеры кода, ссылки на интересные материалы и небольшой чек-лист для проверки вашей базы.