¿Dónde debe almacenar una aplicación compatible con JDBC sus declaraciones SQL y por qué?
Hasta ahora, logré identificar estas opciones:
- Codificado en objetos comerciales
- Incrustado en cláusulas SQLJ
- Encapsular en clases separadas, por ejemplo, objetos de acceso a datos
- Impulsado por metadatos (desacople el esquema de objeto del esquema de datos; describa las asignaciones entre ellos en metadatos)
- Archivos externos (por ejemplo, archivos de propiedades o recursos)
- Procedimientos almacenados
¿Cuáles son los "pros" y los "contras" de cada uno?
¿Debería considerarse el código SQL "código" o "metadatos"?
¿Deben usarse los procedimientos almacenados solo para optimizar el rendimiento o son una abstracción legítima de la estructura de la base de datos?
¿Es el rendimiento un factor clave en la decisión? ¿Qué pasa con el bloqueo del proveedor ?
¿Qué es mejor: acoplamiento suelto o acoplamiento apretado y por qué?
EDITADO: Gracias a todos por las respuestas, aquí hay un resumen:
Mapeos relacionales de objetos (ORM) impulsados por metadatos
Pros:
- Muy abstracto: el servidor de base de datos se puede cambiar sin necesidad de cambiar el modelo
- Amplia difusión: prácticamente un estándar
- Reduce la cantidad de SQL necesaria
- Puede almacenar SQL en archivos de recursos
- El rendimiento es (generalmente) aceptable
- Enfoque impulsado por metadatos
- (Base de datos) independencia del proveedor
Contras:
- Oculta SQL y las verdaderas intenciones de los desarrolladores
- SQL difícil de ser revisado / cambiado por DBA
- SQL todavía podría ser necesario para casos extraños
- Puede forzar el uso de un lenguaje de consulta propietario, por ejemplo, HQL
- No se presta a la optimización (abstracción)
- Puede carecer de integridad referencial
- Sustituye la falta de conocimiento de SQL o la falta de cuidado para codificar en la base de datos
- Nunca iguale el rendimiento de la base de datos nativa (incluso si se acerca)
- El código del modelo está muy ajustado al modelo de la base de datos
Codificado / encapsulado en la capa DAO
Pros:
- SQL se mantiene en los objetos que acceden a los datos (encapsulación)
- SQL es fácil de escribir (velocidad de desarrollo)
- SQL es fácil de rastrear cuando se requieren cambios
- Solución simple (sin arquitectura desordenada)
Contras:
- SQL no puede ser revisado / cambiado por DBA
- Es probable que SQL se vuelva específico de DB
- SQL puede volverse difícil de mantener
Procedimientos almacenados
Pros:
- SQL mantenido en la base de datos (cerca de los datos)
- SQL es analizado, compilado y optimizado por el DBMS
- SQL es fácil de revisar / cambiar para DBA
- Reduce el tráfico de la red
- Seguridad incrementada
Contras:
- SQL está vinculado a la base de datos (bloqueo del proveedor)
- El código SQL es más difícil de mantener
Archivos externos (por ejemplo, archivos de propiedades o recursos)
Pros
- SQL se puede cambiar sin necesidad de reconstruir la aplicación
- Desacopla la lógica SQL de la lógica empresarial de la aplicación.
- Repositorio central de todas las sentencias SQL: más fácil de mantener
- Más fácil de entender
Contras:
- El código SQL puede volverse imposible de mantener
- Es más difícil verificar el código SQL en busca de errores (de sintaxis)
Incrustado en cláusulas SQLJ
Pros:
- Mejor comprobación de sintaxis
Contras:
- Se vincula demasiado con Java
- Rendimiento más bajo que JDBC
- Falta de consultas dinámicas
- No tan popular