Où une application compatible JDBC doit-elle stocker ses instructions SQL et pourquoi?
Jusqu'à présent, j'ai réussi à identifier ces options:
- Codé en dur dans les objets métier
- Intégré dans les clauses SQLJ
- Encapsuler dans des classes séparées, par exemple les objets d'accès aux données
- Basé sur les métadonnées (découpler le schéma d'objet du schéma de données - décrire les mappages entre eux dans les métadonnées)
- Fichiers externes (par exemple, fichiers de propriétés ou de ressources)
- Procédures stockées
Quels sont les «avantages» et les «inconvénients» pour chacun?
Le code SQL doit-il être considéré comme «code» ou «métadonnées»?
Les procédures stockées doivent-elles être utilisées uniquement pour l'optimisation des performances ou sont-elles une abstraction légitime de la structure de la base de données?
La performance est-elle un facteur clé dans la décision? Qu'en est-il du verrouillage des fournisseurs ?
Qu'est-ce qui est mieux - couplage desserré ou couplage serré et pourquoi?
EDITED: Merci à tous pour les réponses - voici un résumé:
Mappages relationnels d'objets (ORM) basés sur les métadonnées
Avantages:
- Très abstrait - le serveur de base de données peut être commuté sans qu'il soit nécessaire de changer de modèle
- Large diffusion - pratiquement une norme
- Réduit la quantité de SQL nécessaire
- Peut stocker SQL dans des fichiers de ressources
- La performance est (généralement) acceptable
- Approche axée sur les métadonnées
- (Base de données) Indépendance des fournisseurs
Les inconvénients:
- Cache les intentions de SQL et des véritables développeurs
- SQL difficile à réviser / modifier par DBA
- SQL peut encore être nécessaire pour les cas impairs
- Peut forcer l'utilisation d'un langage de requête propriétaire, par exemple HQL
- Ne se prête pas à l'optimisation (abstraction)
- Peut manquer d'intégrité référentielle
- Remplace le manque de connaissances SQL ou le manque de soin du code dans la base de données
- Ne correspond jamais aux performances de la base de données native (même si elles s'en rapprochent)
- Le code du modèle est très étroitement associé au modèle de base de données
Codé en dur / encapsulé dans la couche DAO
Avantages:
- SQL est conservé dans les objets qui accèdent aux données (encapsulation)
- SQL est facile à écrire (vitesse de développement)
- SQL est facile à localiser lorsque des modifications sont nécessaires
- Solution simple (pas d'architecture désordonnée)
Les inconvénients:
- SQL ne peut pas être révisé / modifié par DBA
- SQL est susceptible de devenir spécifique à la base de données
- SQL peut devenir difficile à maintenir
Procédures stockées
Avantages:
- SQL conservé dans la base de données (proche des données)
- SQL est analysé, compilé et optimisé par le SGBD
- SQL est facile à réviser / modifier pour DBA
- Réduit le trafic réseau
- Une sécurité accrue
Les inconvénients:
- SQL est lié à la base de données (verrouillage du fournisseur)
- Le code SQL est plus difficile à maintenir
Fichiers externes (par exemple, fichiers de propriétés ou de ressources)
Avantages
- SQL peut être modifié sans avoir besoin de reconstruire l'application
- Découple la logique SQL de la logique métier de l'application
- Référentiel central de toutes les instructions SQL - plus facile à maintenir
- Plus facile à comprendre
Les inconvénients:
- Le code SQL peut devenir non maintenable
- Plus difficile de vérifier le code SQL pour les erreurs (de syntaxe)
Intégré dans les clauses SQLJ
Avantages:
- Meilleure vérification de la syntaxe
Les inconvénients:
- Est trop lié à Java
- Performances inférieures à JDBC
- Manque de requêtes dynamiques
- Pas si populaire