Je dois mentionner les problèmes de DRY dans le monde des bases de données relationnelles. Les bases de données sont conçues pour fonctionner rapidement et efficacement en utilisant une logique basée sur les ensembles et des requêtes simples. Les principes de DRY amènent souvent le développeur à écrire des requêtes non compressables ou à utiliser la logique Ligne par ligne pour exploiter le code existant dans plusieurs situations. DRY et l'optimisation des performances sont souvent contradictoires et dans le monde des bases de données, les performances sont généralement beaucoup plus critiques que la maintenabilité. Cela ne signifie pas que vous ne devez absolument pas utiliser les principes DRY, mais que vous devez savoir comment cela affectera la convivialité globale de la base de données. Les développeurs d’applications sèchent d’abord sur le sec, puis sur les performances, puis sur l’intégrité des données, puis sur la sécurité, puis sur la sécurité des données.
En général, j'ai remarqué que plus le nombre de couches d'abstraction dans les requêtes de base de données est lent, plus elles deviennent lentes. Je ne dis pas que je ne souhaitais pas que les concepteurs de programmes de base de données eux-mêmes ne permettent pas aux développeurs d'utiliser DRY sans affecter la performance de la base de données, mais je ne conçois pas de logiciel de base de données à ce niveau. , donc peut-être que le conflit entre abstraction et performance dans la base de données est plus difficile à résoudre que je suppose. Cependant, nous devons travailler avec les systèmes tels qu'ils sont actuellement construits. Nous pouvons demander une meilleure mise en œuvre des principes de DRY dans les versions à venir, ce qui ne réduira pas non plus les performances (et cela s'est amélioré au fil des ans, mais reste problématique), mais entre-temps, nous devons déterminer si DRY est le bon choix pour cette base de données. en ce moment.
Mais souvent, les fonctionnalités que vous souhaitez utiliser pour garantir le respect du principe DRY sont celles qui posent d'énormes problèmes à la base de données. Je ne dis pas qu'il ne faut jamais utiliser DRY mais qu'il ne faut pas en abuser.
Des exemples de ce que je parle. Vous devez importer un million de données une fois par mois. Les enregistrements peuvent déjà être ajoutés manuellement via l'interface utilisateur en appelant un proc stocké. Ce processus, parce qu’il a été conçu pour les importations d’enregistrements uniques, n’ajoute qu’un enregistrement à la fois. En utilisant DRY pour éviter d'avoir le code d'insertion à deux endroits, vous écrivez un curseur pour appeler le proc à plusieurs reprises plutôt que d'écrire les importations basées sur les ensembles dont vous avez besoin. Le temps nécessaire à l’importation va de 30 minutes à 18 heures avec la logique basée sur les ensembles. Dans ce cas, la bonne façon d’adhérer à DRY serait de corriger le processus permettant de gérer les importations d’enregistrements multiples. Malheureusement, il est souvent impossible ou très difficile d’envoyer un tableau à un proc (en fonction du back-end de la base de données) et en changeant le proc, vous finissez par casser l’application.
Les fonctions scalaires et les fonctions table sont également utilisées pour implémenter les principes DRY et, là encore, elles peuvent sérieusement affecter les performances, en particulier si vous devez les utiliser de manière à éviter que les index ne soient utiles.
Les vues sont également utiles pour la mise en œuvre de DRY. Toutefois, si vous implémentez DRY en utilisant des vues appelant des vues appelant d'autres vues, vous arriverez rapidement au point d'expiration du délai de chargement des requêtes. En fait, vous pourriez avoir besoin de générer des ensembles de données de millions d'enregistrements alors que vous n'en avez besoin que de trois à la fin. Ainsi, une vue à un niveau d'un ensemble complexe de jointures pour implémenter DRY peut être excellente (j'en ai moi-même une que nous utilisons pour nous assurer que tous les rapports financiers utilisent le même ensemble de base de tableaux et de calculs de certaines choses), plus de deux niveaux. et vous devez considérer si vous créez un gâchis de performances.