Перейти к содержимому
12 / 15

Ограничения целостности: что доверить базе, а что проверять в коде?

База — единственное место, где инвариант выполняется при любых условиях: при гонках, при повторных попытках, при выполнении миграции из консоли, при работе второго сервиса. Поэтому в схему выносят всё, что там выразимо: NOT NULL, CHECK для диапазонов и согласованности колонок, UNIQUE для естественных ключей, FOREIGN KEY для ссылок, EXCLUDE для «не должно пересекаться». Проверка «сначала SELECT, потом INSERT» в коде не заменяет уникального индекса: между двумя запросами другая транзакция успевает вставить строку, и дубли появляются именно под нагрузкой. В коде остаётся то, что база не знает: правила, зависящие от внешних систем, сложные бизнес-условия, дружелюбные сообщения об ошибках. Цена ограничений — проверки на записи и блокировки при добавлении на большую таблицу; в высоконагруженных таблицах внешние ключи иногда осознанно снимают, но это компромисс, а не норма.

Ограничения целостности: что доверить базе, а что проверять в коде? | JScriptiser