Я думаю, что вопрос об ответственности за качество данных.
Ответ зависит от того, как вы видите систему.
Если вы видите базу данных как независимую, отдельную и автономную службу, отдельную от приложения, то база данных отвечает за обеспечение согласованности и качества содержащихся в ней данных. По сути, потому что эта база данных может использоваться другим приложением, поэтому она не может полагаться на то, что второе приложение имеет одинаковую согласованность и качество поведения. В этих условиях база данных должна быть спроектирована таким образом, чтобы предоставлять API и автономное поведение. В этом представлении есть как минимум два приложения, одно из которых является базой данных, а другое - приложением, использующим его.
И наоборот, базу данных можно рассматривать как сложную форму файла, которая находится под прямым и полным контролем приложения. В этом смысле база данных превращается в чистый инструмент сериализации и навигации по документам. Он может предоставлять некоторые расширенные возможности для поддержки запросов и обслуживания документов (как это делают JSON или XML-инструменты), но, опять же, в этом нет необходимости (как это делают большинство файловых потоков). В этом случае ответственность за поддержание правильного формата и содержимого в файле лежит исключительно на программах. В этом представлении есть одно приложение.
В обоих случаях следующий вопрос заключается в том, как поддержать использование базы данных в качестве необычного файла или отдельной службы. Вы можете достичь этого путем:
- используя инструменты, предоставляемые платформой базы данных в виде таблиц / представлений / хранимых процедур / триггеров / и т. д.
- упаковка самой базы данных в службу, которую все клиенты должны использовать для доступа к базе данных
- упаковка базы данных в библиотеку, которая должна использоваться всеми клиентами для доступа к данным.
Каждый из них имеет свои плюсы и минусы и будет зависеть от архитектурных ограничений среды, в которой работает система.
Независимо от того, какое представление вы принимаете, оно всегда платит за проверку данных на границах.
- Проверьте поля в пользовательском интерфейсе, который вводит пользователь
- Проверьте запрос сети / API, прежде чем он покинет клиента
- Проверяйте запрос сети / API на сервере, прежде чем делать что-либо
- Проверка данных, передаваемых в бизнес-правила
- Проверяйте данные перед сохранением
- Проверка данных после извлечения из постоянства
- ну и так далее
То, насколько валидация оправдана на каждой границе, зависит от того, насколько рискованно ее не валидировать.
- умножить два числа вместе?
- Вы ошиблись номером, это проблема?
- Вызов процедуры в данной области памяти?
- Что находится в этом месте памяти?
- Что происходит, если объект не существует или находится в плохом состоянии?
- используя регулярное выражение для строки, содержащей кандзи?
- Может ли модуль regex обрабатывать юникод?
- Может ли регулярное выражение обрабатывать Unicode?
However, why not perform validation of data on the application side before storing them into the database?
ну, эти два не являются взаимоисключающими. Скорее всего, вы будете проверять разные вещи с обеих сторон. В то время как валидации на стороне приложения ориентированы на бизнес, валидации в базе данных более ориентированы на данные. Думайте в базе данных, питаемой несколькими различными приложениями.