Когда я рассматриваю модели баз данных для 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-запросы имеют высокий риск введения недопустимых значений.
И тут возникает мой вопрос:
Каковы причины для моделирования реляционных баз данных без проверочных ограничений и в конечном итоге даже без внешних ключей?
Что бы это ни стоило, этот вопрос и ответы, которые я получил (особенно интересное обсуждение с Томасом Килианом), побудили меня написать статью с моими выводами на тему ограничений базы данных .