Выбор метода реализации SQL
Я запутался в построении ограничений SQL.
Предположим, у меня есть две таблицы с именем person и rent_car. У человека есть два столбца с именем person_id, job. Rent_car также имеет два столбца с именами person_id и renting_date.
Сдерживает:
- если человек врач, то он / она арендует автомобиль только с 12.00 до 19.00. Другие люди могут арендовать автомобиль с 10.00 до 18.00.
- если человек врач, то идентификатор должен включать "д-р".
Какой метод мне подходит? Триггер, проверка или утверждение и почему?
1 ответ
Триггеры случаются, декларативные ограничения есть.
Декларативные ограничения описывают состояние, в котором данные являются действительными, и поэтому они должны выполняться всегда. Это означает, что достоверность записи в отношении декларативного ограничения может измениться, только если данные в записи изменятся; действительность записи не должна изменяться в результате какого-либо события в другой части вселенной. Вот почему в системах, которые их применяют, ограничения проверки могут не ссылаться на системные переменные, такие как CURRENT_TIME
или же CURRENT_USER
которые меняются со временем, или для других записей в таблице или для записей в других таблицах. Ограничение внешнего ключа ON DELETE
а также ON UPDATE
предложения не позволяют изменениям в родительской таблице сделать записи в дочерней таблице недействительными.
Триггер, с другой стороны, представляет собой процедуру, которая выполняется в отдельные моменты времени. Любые тесты, которые он выполняет, должны выполняться только в тот момент, когда они выполняются, и проверяются только на основе мгновенных значений их аргументов. Таким образом, триггеры могут свободно ссылаться на динамические системные переменные, другие записи, другие таблицы или даже другие базы данных.
На твой вопрос. Я бы использовал декларативное ограничение для вашего второго случая, когда вы сравниваете запись с константной строкой. Для аренды это будет зависеть. Если база данных регистрирует аренду, осуществляемую "прямо сейчас", то время сравнивается с "прямо сейчас", что можно сделать только в триггере. Если в таблице записаны резервирования для будущих прокатов, то время проката сравнивается с константами, и было бы целесообразно проверить ограничение.
Насколько я понимаю, утверждения являются инструментом для проверки правильности вашего кода, а не ваших данных, и поэтому не являются подходящим инструментом для реализации бизнес-правил.
Надеюсь, это поможет.