Tengo que mencionar los problemas con DRY en el mundo de la base de datos relacional. Las bases de datos están diseñadas para funcionar de manera rápida y correcta mediante la lógica basada en conjuntos y mediante consultas que se pueden modificar. Los principios DRY a menudo hacen que el desarrollador escriba consultas no Sargable o use la lógica Row-by-agonizing-Row para aprovechar el código existente en múltiples situaciones. DRY y la optimización del rendimiento a menudo están en desacuerdo y, en el mundo de las bases de datos, el rendimiento suele ser mucho más crítico que la capacidad de mantenimiento. Esto no significa que no deba usar los principios DRY en absoluto, solo que debe ser consciente de cómo afectará la usabilidad general de la base de datos. Los desarrolladores de aplicaciones son SECOS en primer lugar y el rendimiento en segundo lugar, los desarrolladores de bases de datos piensan en primer lugar la integridad de los datos, el rendimiento en segundo lugar, la seguridad de los datos en tercer lugar (el rendimiento y la seguridad pueden cambiar de lugar en algunos sistemas).
En general, he notado que cuantas más capas de abstracción pongas en las consultas de la base de datos, más lentas se volverán. No estoy diciendo que no quisiera que las personas que diseñan los programas de la base de datos no hicieran un mejor trabajo al permitir que los desarrolladores usen DRY sin afectar lo bien que funciona la base de datos, pero no diseño software de base de datos a ese nivel , entonces quizás el conflicto entre la abstracción y el rendimiento en la base de datos es más difícil de arreglar de lo que supongo. Sin embargo, tenemos que trabajar con los sistemas tal como están construidos actualmente. Podemos pedir una mejor implementación de los principios de DRY en futuras versiones que también no afectarán el rendimiento (y ha mejorado a través de los años pero sigue siendo problemático), pero mientras tanto debemos considerar si DRY es el movimiento correcto para esta base de datos. en este momento.
Pero a menudo las mismas características que desea utilizar para garantizar el cumplimiento del principio DRY son las que causan tremendos problemas a la base de datos. No digo que nunca uses DRY, pero no te excedas.
Ejemplos de lo que estoy hablando. Debe importar un millón de registros una vez al mes. Los registros ya se pueden agregar manualmente a través de la interfaz de usuario llamando a un proceso almacenado. Este proceso, debido a que fue diseñado para importar registros únicos, solo agrega un registro a la vez. Usando DRY para evitar tener el código de inserción en dos lugares, escribe un cursor para llamar al proceso repetidamente en lugar de escribir las importaciones basadas en conjuntos que necesita. El tiempo para la importación va de los 30 minutos que tomaría usar la lógica basada en conjuntos a 18 horas. Ahora, la forma correcta de adherirse a DRY en este caso sería arreglar el proceso para manejar múltiples importaciones de registros. Desafortunadamente, a menudo es imposible o muy difícil enviar una matriz a un proceso (dependiendo del back-end de db) y al cambiar el proceso, terminas rompiendo la aplicación.
Las funciones escalares y las funciones con valores de tabla también se utilizan para implementar los principios DRY y, una vez más, pueden afectar seriamente el rendimiento, especialmente si necesita usarlas de una manera que evite que los índices sean útiles.
Las vistas también son buenas para implementar DRY. Sin embargo, si implementa DRY mediante el uso de vistas que llaman vistas que llaman a otras vistas, llegará rápidamente al punto en que las consultas se agotarán bajo carga. De hecho, puede terminar necesitando generar conjuntos de datos de millones de registros cuando solo necesita tres al final. Por lo tanto, una vista de un nivel de un conjunto complejo de combinaciones para implementar DRY puede ser excelente (yo mismo tengo una que usamos para asegurarnos de que todos los informes financieros usen el mismo conjunto de tablas y cálculos de ciertas cosas), más de dos niveles y debe considerar si está creando un desastre de rendimiento.