Выбор метода реализации 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 предложения не позволяют изменениям в родительской таблице сделать записи в дочерней таблице недействительными.

Триггер, с другой стороны, представляет собой процедуру, которая выполняется в отдельные моменты времени. Любые тесты, которые он выполняет, должны выполняться только в тот момент, когда они выполняются, и проверяются только на основе мгновенных значений их аргументов. Таким образом, триггеры могут свободно ссылаться на динамические системные переменные, другие записи, другие таблицы или даже другие базы данных.

На твой вопрос. Я бы использовал декларативное ограничение для вашего второго случая, когда вы сравниваете запись с константной строкой. Для аренды это будет зависеть. Если база данных регистрирует аренду, осуществляемую "прямо сейчас", то время сравнивается с "прямо сейчас", что можно сделать только в триггере. Если в таблице записаны резервирования для будущих прокатов, то время проката сравнивается с константами, и было бы целесообразно проверить ограничение.

Насколько я понимаю, утверждения являются инструментом для проверки правильности вашего кода, а не ваших данных, и поэтому не являются подходящим инструментом для реализации бизнес-правил.

Надеюсь, это поможет.

Другие вопросы по тегам