Je suis sûr que je ne suis pas le seul à être frustré lorsqu'ils voient une page de code jonchée de requêtes SQL. ActiveRecord et d'autres modèles ORM permettent d'atténuer une bonne quantité de SQL utilisé dans un projet, mais dans de nombreux cas de requêtes complexes, l'utilisation de SQL est apparemment inévitable.
Je recherche des opinions sur la façon dont les requêtes SQL doivent être organisées avec le reste du code (ou en externe) pour l'empêcher d'être dispersé partout? Une idée évidente est l'utilisation de vues, mais souvent les vues peuvent être une source de problèmes de performances lors du traitement de plusieurs grandes tables indexées, etc.
EDIT 1 - Je suppose que vous l'avez déjà séparé dans la couche modèle
sql
code-formatting
méduse
la source
la source
Réponses:
Pour moi, SQL est une partie fondamentale (dans de nombreux cas, la majorité) du code de logique métier. Si vous essayez de le séparer du code qui opère sur les données retournées, vous êtes plus enclin à déséquilibrer la compréhensibilité et la maintenabilité du code.
À mon avis, lire des données, traiter des données, écrire des données, rechercher des données ... ce sont toutes des opérations similaires, et il vaut mieux les garder au même endroit.
Si vous commencez à sentir une duplication des efforts avec les requêtes, vous avez peut-être besoin d'une vue de base de données ou d'un objet qui peut encapsuler cet aspect de l'accès à la base de données.
Une autre astuce consiste à avoir une bonne méthode de requête de base de données. Dans les logiciels que j'écris (PostgreSQL, MySQL, SQL Server), j'ai veillé à ce que la majeure partie de mes opérations de requête puisse avoir lieu comme une seule déclaration de code.
Ce sont (grosso modo) les principaux appels de fonction dont je m'assure qu'ils font partie de mon "objet de connexion". Cela dépend de la langue, de ce que vous implémentez réellement, mais mon but est de le garder vraiment, vraiment simple et indolore.
En résumé, traitez SQL comme une partie native de la programmation et n'abstenez pas pour l'abstraction.
la source
Généralement, avoir une couche de modèle distincte est la meilleure approche. Il existe un certain nombre de modèles de conception d'entreprise qui permettent de concevoir cela.
la source
Il pourrait être judicieux de séparer votre couche de modèle en 3 sous-couches - "entités", "référentiels" et "services". Cela vous permettra de séparer les préoccupations et de rassembler SQL en un seul endroit, hors de votre logique métier.
Dans ce scénario, tout le code de récupération de données, y compris SQL complexe, sera situé dans des référentiels. Le but du référentiel est donc de cacher des instructions SQL complexes derrière des méthodes explicites comme
getUsersWithActiveSubscription()
.L'entité résume les vrais noms de champ de table DB avec des getters et setters, peut fournir une certaine conversion de données entre les types de champs DB et les types disponibles dans votre langage d'application / de programmation. Si votre ORM le prend en charge, les entités peuvent gérer les associations.
La couche de service est le lieu de la logique métier. Le service récupère les entités à l'aide de référentiels, agit sur elles et les stocke.
la source