Na minha experiência, muitos dos projetos que li no passado não tinham definições de relacionamento no banco de dados, mas apenas no código-fonte. Então, eu estou querendo saber quais são as vantagens / desvantagens de definir relações entre tabelas no banco de dados e no código-fonte? E a questão mais ampla é sobre outros recursos avançados em bancos de dados modernos, como cascata, gatilhos, procedimentos ... Há alguns pontos em meus pensamentos:
No banco de dados:
Corrija os dados do design. Evite erros de aplicativo que podem causar dados inválidos.
Reduza o ida e volta da rede para o aplicativo ao inserir / atualizar dados, pois o aplicativo precisa fazer mais consultas para verificar a integridade dos dados.
No código fonte:
Mais flexível.
Melhor ao escalonar para vários bancos de dados, pois às vezes a relação pode ser entre bancos de dados.
Mais controle sobre a integridade dos dados. O banco de dados não precisa verificar toda vez que o aplicativo modifica os dados (a complexidade pode ser O (n) ou O (n log n) (?)). Em vez disso, é delegado ao aplicativo. E acho que lidar com a integridade dos dados no aplicativo levará a mensagens de erro mais detalhadas do que usar o banco de dados. Por exemplo: quando você cria um servidor de API, se definir as relações no banco de dados, e algo der errado (como a entidade referenciada não existe), você receberá uma Exceção SQL com uma mensagem. A maneira mais simples será retornar 500 ao cliente, indicando que há um "erro interno do servidor" e o cliente não terá idéia do que está acontecendo de errado. Ou o servidor pode analisar a mensagem para descobrir o que está errado, o que é uma maneira feia e propensa a erros na minha opinião. Se você deixar o aplicativo lidar com isso,
Mais alguma coisa?
Edit: como Kilian aponta, meu argumento sobre desempenho e integridade de dados é muito equivocado. Então eu editei para corrigir o meu ponto lá. Entendo perfeitamente que deixar o banco de dados lidar com isso será uma abordagem mais eficiente e robusta. Por favor, verifique a pergunta atualizada e pense sobre isso.
Edit: obrigado a todos. As respostas que recebi apontam que as restrições / relações devem ser definidas no banco de dados. :). Tenho mais uma pergunta, pois ela está fora do escopo desta questão, acabei de postá-la como uma pergunta separada: Manipular erro de banco de dados no servidor API . Por favor, deixe algumas idéias.