Onde um aplicativo compatível com JDBC deve armazenar suas instruções SQL e por quê?
Até agora, consegui identificar essas opções:
- Codificado em objetos de negócios
- Incorporado em cláusulas SQLJ
- Encapsular em classes separadas, por exemplo, objetos de acesso a dados
- Orientado por metadados (desacoplar o esquema do objeto do esquema de dados - descrever os mapeamentos entre eles nos metadados)
- Arquivos externos (por exemplo, propriedades ou arquivos de recursos)
- Procedimentos armazenados
Quais são os “prós” e “contras” de cada um?
O código SQL deve ser considerado “código” ou “metadados”?
Os procedimentos armazenados devem ser usados apenas para otimização de desempenho ou são uma abstração legítima da estrutura do banco de dados?
O desempenho é um fator chave na decisão? E quanto ao aprisionamento do fornecedor ?
O que é melhor - acoplamento fraco ou acoplamento apertado e por quê?
EDITADO: Obrigado a todos pelas respostas - aqui está um resumo:
Orientado por metadados, ou seja, mapeamentos de objetos relacionais (ORM)
Prós:
- Muito abstrato - o servidor de banco de dados pode ser alternado sem a necessidade de alterar o modelo
- Ampla distribuição - praticamente um padrão
- Reduz a quantidade de SQL necessária
- Pode armazenar SQL em arquivos de recursos
- O desempenho é (geralmente) aceitável
- Abordagem baseada em metadados
- (Banco de dados) independência do fornecedor
Contras:
- Oculta SQL e verdadeiras intenções de desenvolvedores
- SQL difícil de ser revisado / alterado pelo DBA
- SQL ainda pode ser necessário para casos ímpares
- Pode forçar o uso de uma linguagem de consulta proprietária, por exemplo, HQL
- Não se presta à otimização (abstração)
- Pode faltar integridade referencial
- Substitui por falta de conhecimento de SQL ou falta de cuidado para codificar no BD
- Nunca corresponda ao desempenho do banco de dados nativo (mesmo que se aproxime)
- O código do modelo é muito estreitamente acoplado ao modelo de banco de dados
Codificado / encapsulado na camada DAO
Prós:
- O SQL é mantido nos objetos que acessam os dados (encapsulamento)
- SQL é fácil de escrever (velocidade de desenvolvimento)
- SQL é fácil de rastrear quando mudanças são necessárias
- Solução simples (sem arquitetura confusa)
Contras:
- SQL não pode ser revisado / alterado pelo DBA
- É provável que o SQL se torne específico do banco de dados
- SQL pode se tornar difícil de manter
Procedimentos armazenados
Prós:
- SQL mantido no banco de dados (próximo aos dados)
- SQL é analisado, compilado e otimizado pelo DBMS
- O SQL é fácil para o DBA revisar / alterar
- Reduz o tráfego de rede
- Maior segurança
Contras:
- O SQL está vinculado ao banco de dados (dependência do fornecedor)
- O código SQL é mais difícil de manter
Arquivos externos (por exemplo, propriedades ou arquivos de recursos)
Prós
- O SQL pode ser alterado sem a necessidade de reconstruir o aplicativo
- Separa a lógica SQL da lógica de negócios do aplicativo
- Repositório central de todas as instruções SQL - mais fácil de manter
- Mais fácil de entender
Contras:
- O código SQL pode se tornar impossível de manter
- Mais difícil de verificar se há erros (de sintaxe) no código SQL
Incorporado em cláusulas SQLJ
Prós:
- Melhor verificação de sintaxe
Contras:
- Ligações muito próximas de Java
- Desempenho inferior ao JDBC
- Falta de consultas dinâmicas
- Não tão popular