Когда я рассматриваю модели баз данных для RDBMS, я обычно удивляюсь, обнаружив, что ограничения практически отсутствуют (кроме PK / FK). Например, процент часто хранится в столбце типа int(хотя это tinyintбыло бы более уместно), и нет CHECKограничения для ограничения значения до диапазона 0..100. Аналогично в SE.SE ответы, предлагающие проверочные ограничения, часто получают комментарии, указывающие на то, что база данных является неподходящим местом для ограничений.
Когда я спрашиваю о решении не применять ограничения, члены команды отвечают:
Либо они даже не знают, что такие функции существуют в их любимой базе данных. Это понятно для программистов, использующих только ORM, но гораздо меньше для администраторов баз данных, которые утверждают, что имеют более 5 лет опыта работы с данной RDBMS.
Или то, что они применяют такие ограничения на уровне приложений, и дублирование этих правил в базе данных не является хорошей идеей, нарушая SSOT.
В последнее время я вижу все больше и больше проектов, в которых даже внешние ключи не используются. Точно так же я видел несколько комментариев здесь на SE.SE, которые показывают, что пользователи не заботятся о ссылочной целостности, позволяя приложению справиться с этим.
Отвечая на вопрос команд о выборе не использовать FK, они говорят, что:
Это PITA, например, когда нужно удалить элемент, на который есть ссылки в других таблицах.
NoSQL качается, и там нет внешних ключей. Поэтому они нам не нужны в РСУБД.
Это не имеет большого значения с точки зрения производительности (контекст, как правило, представляет собой небольшие веб-приложения для интрасети, работающие с небольшими наборами данных, поэтому даже индексы не будут иметь большого значения; никого не волнует, если производительность данного запроса превышает 1,5 с. до 20 мс)
Когда я смотрю на само приложение, я систематически замечаю два паттерна:
Приложение правильно очищает данные и проверяет их перед отправкой в базу данных. Например, нет способа сохранить значение
102в процентах через приложение.Приложение предполагает, что все данные, которые поступают из базы данных, являются абсолютно действительными. То есть, если он выражается
102в процентах, либо что-то, где-то произойдет сбой, либо это будет просто отображаться пользователю, что приводит к странным ситуациям.Хотя более 99% запросов выполняется одним приложением, со временем начинают появляться скрипты - либо скрипты, запускаемые вручную при необходимости, либо задания cron. Некоторые операции с данными также выполняются вручную над самой базой данных. Как скрипты, так и ручные SQL-запросы имеют высокий риск введения недопустимых значений.
И тут возникает мой вопрос:
Каковы причины для моделирования реляционных баз данных без проверочных ограничений и в конечном итоге даже без внешних ключей?
Что бы это ни стоило, этот вопрос и ответы, которые я получил (особенно интересное обсуждение с Томасом Килианом), побудили меня написать статью с моими выводами на тему ограничений базы данных .