Eu acho que a pergunta é sobre responsabilidade pela qualidade dos dados.
A resposta depende de como você vê o sistema.
Se você vê o banco de dados como um serviço independente, distinto e autônomo separado do aplicativo, o banco de dados é responsável por garantir a consistência e a qualidade dos dados que ele contém. Essencialmente, porque esse banco de dados pode ser usado por um aplicativo diferente, não pode contar com o segundo aplicativo com os mesmos comportamentos de consistência e qualidade. Nessas circunstâncias, o banco de dados precisa ser projetado para expor uma API e um comportamento autônomo. Nesta visão, existem pelo menos dois aplicativos, um deles é o banco de dados e o outro é o aplicativo que o utiliza.
Por outro lado, o banco de dados pode ser considerado uma forma complicada de arquivo que está sob o controle direto e total do aplicativo. Nesse sentido, o banco de dados passa a ser uma pura ferramenta de serialização e navegação de documentos. Ele pode fornecer alguns comportamentos avançados para dar suporte a consultas e manutenção de documentos (como JSON ou ferramentas XML), mas, novamente, não é necessário (como a maioria dos fluxos de arquivos). Nesse caso, é de inteira responsabilidade do programa manter o formato e o conteúdo corretos no arquivo. Nesta visão, há um aplicativo.
Nos dois modos de exibição, a próxima pergunta é como dar suporte ao uso do banco de dados como um arquivo sofisticado ou como um serviço separado. Você pode conseguir isso:
- usando as ferramentas que a plataforma de banco de dados fornece na forma de tabelas / visualizações / procedimentos armazenados / gatilhos / etc ...
- agrupando o próprio banco de dados em um serviço que todos os clientes devem usar para acessar o banco de dados
- agrupando o banco de dados em uma biblioteca que deve ser usada por todos os clientes para acessar os dados.
Cada um vem com seus próprios prós / contras e dependerá das restrições arquiteturais do ambiente em que o sistema opera.
Independentemente de qual visão você adote, sempre vale a pena validar os dados nos limites.
- Validar os campos em uma interface do usuário que um usuário digita
- Valide a solicitação de rede / API antes de deixar o cliente
- Valide a solicitação de rede / API no servidor antes de fazer qualquer coisa
- Validar os dados que estão sendo passados para as regras de negócios
- Valide os dados antes de persistir
- Valide os dados após serem recuperados da persistência
- Assim por diante e assim por diante
A quantidade de validação garantida em cada limite depende de quanto é arriscado não validá-lo.
- multiplicando dois números juntos?
- você recebe o número errado, isso é um problema?
- invocando um procedimento em um determinado local de memória?
- O que há nessa localização de memória?
- O que acontece se o objeto não existir ou estiver em mau estado?
- usando um regex em uma string contendo kanji?
- O módulo regex pode lidar com unicode?
- O regex pode lidar com unicode?
However, why not perform validation of data on the application side before storing them into the database?
bem, esses dois não são mutuamente exclusivos. É provável que você valide coisas diferentes dos dois lados. Embora as validações no lado do aplicativo sejam centradas nos negócios, as validações no banco de dados são mais centradas nos dados. Pense em um banco de dados alimentado por vários e diferentes aplicativos.