Я не согласен с рекомендацией о каждый слой, все время. Это звучит слишком догматично для меня.
Весь дизайн представляет собой выбор между функциональностью и стоимостью. Ваш выбор проверки должен отражать это также.
Я думаю, что ваши решения должны учитывать разделение и повторное использование слоев.
Если база данных используется несколькими приложениями, база данных не может зависеть от правильности каждой проверки приложения. В этом случае база данных должна проверяться, чтобы защитить себя.
В наши дни и в эпоху атак с использованием SQL-инъекций я считаю обязательным обязательное связывание и проверку до достижения уровня сохраняемости. Схема должна делать то, что должна, для обеспечения ссылочной и деловой целостности (например, уникальные ограничения для столбцов и обязательное «не нулевое»), но другие проверки должны быть выполнены до попадания в базу данных.
Если база данных полностью принадлежит одному и только одному приложению, и существует служба, которая является единственным шлюзом для данных, тогда служба может выполнить проверку. Стоимость дублирования проверки на уровне базы данных может быть отменена.
Аналогично между пользовательским интерфейсом и уровнем обслуживания.
Двойная проверка на клиентских и сервисных уровнях является обычной, поскольку сервис совместно используется многими клиентами в сервис-ориентированной архитектуре. Сегодня ваш сервис может использоваться браузерным интерфейсом; вдруг рядом с ним появляется множество мобильных приложений, которые также требуют услуг. В этом случае служба обязательно должна проверять и связывать каждый запрос.
Ни один производитель не полирует каждую поверхность до зеркального качества. Иногда допускается шероховатая литая поверхность, потому что выгода от шлифовки и полировки незначительна, а стоимость слишком велика.
То же с программным обеспечением.
Мне не нравятся догматические высказывания. Лучше понять последствия вашего выбора. Знайте правила и когда нужно их нарушать.