Наилучшая практика : если вы можете сделать это с ограничением, используйте ограничение.
Триггеры не так плохи, как дискредитация (если их использовать правильно), хотя я всегда буду использовать ограничение там, где это возможно. В современной RDMS накладные расходы на производительность триггеров сопоставимы с ограничениями (конечно, это не означает, что кто-то не может поместить ужасный код в триггер!).
Иногда необходимо использовать триггер для принудительного применения «сложного» ограничения, например, ситуации, когда требуется принудительно заполнить одно и только одно из двух полей внешнего ключа таблицы (я видел эту ситуацию в нескольких доменах). модели).
Дискуссия о том, должна ли бизнес-логика находиться в приложении, а не в БД, в некоторой степени зависит от среды; если у вас есть много приложений, обращающихся к БД, как ограничения, так и триггеры могут служить конечной гарантией того, что данные верны.