Eu tenho que mencionar os problemas com o DRY no mundo do banco de dados relacional. Os bancos de dados são projetados para um desempenho rápido e bom, usando lógica baseada em conjunto e através de consultas sargable. Os princípios DRY geralmente fazem com que o desenvolvedor grave consultas não-suscetíveis de Sargable ou use a lógica Row-by-agonizing-Row para aproveitar o código existente em várias situações. A DRY e a otimização do desempenho geralmente estão em desacordo e, no mundo dos bancos de dados, o desempenho geralmente é muito mais crítico do que a capacidade de manutenção. Isso não significa que você não deva usar os princípios DRY, apenas esteja ciente de como isso afetará a usabilidade geral do banco de dados. Os desenvolvedores de aplicativos consideram DRY primeiro e o desempenho segundo, os desenvolvedores de banco de dados acham a integridade dos dados primeiro, o desempenho segundo, a segurança dos dados em terceiro (desempenho e segurança podem trocar de lugar em alguns sistemas).
Percebi, em geral, que quanto mais camadas de abstração você coloca no banco de dados, mais lenta elas se tornam. Não estou dizendo que não desejo que as pessoas que projetam os programas da base de dados não trabalhem melhor ao permitir que os desenvolvedores usem DRY sem afetar o desempenho do banco de dados, mas não projeto software de banco de dados nesse nível , então talvez o conflito entre abstração e desempenho no banco de dados seja mais difícil de corrigir do que eu suponho. No entanto, temos que trabalhar com os sistemas como eles são construídos atualmente. Podemos pedir uma melhor implementação dos princípios DRY em versões futuras que também não prejudicam o desempenho (e que melhorou ao longo dos anos, mas ainda é problemático), mas, enquanto isso, devemos considerar se DRY é o movimento certo para esse banco de dados. nesse momento.
Mas muitas vezes os mesmos recursos que você deseja usar para garantir o cumprimento do princípio DRY são os que causam enormes problemas ao banco de dados. Não estou dizendo que nunca use DRY, mas não exagere.
Exemplos do que estou falando. Você precisa importar dados de um milhão de registros uma vez por mês. Os registros já podem ser adicionados manualmente através da interface do usuário chamando um processo armazenado. Este processo, por ter sido projetado para importações de registro único, adiciona apenas um registro por vez. Usando DRY para evitar o código de inserção em dois lugares, você escreve um cursor para chamar o proc repetidamente, em vez de gravar as importações baseadas em conjuntos necessárias. O tempo para a importação vai dos 30 minutos necessários para usar a lógica baseada em conjunto a 18 horas. Agora, a maneira correta de aderir ao DRY nesse caso seria corrigir o processo para lidar com várias importações de registros. Infelizmente, muitas vezes é impossível ou muito difícil enviar uma matriz para um proc (dependendo do back end do banco de dados) e, alterando o proc, você acaba quebrando o aplicativo.
Funções escalares e funções com valor de tabela também são usadas para implementar os princípios DRY e, novamente, elas podem afetar seriamente o desempenho, especialmente se você precisar usá-las de maneira a impedir que os índices sejam úteis.
As visualizações também são boas para a implementação de DRY. No entanto, se você implementar o DRY através do uso de visualizações que chamam visualizações que chamam outras visualizações, chegará rapidamente ao ponto em que as consultas atingirão o tempo limite sob carga. Na verdade, você pode precisar gerar conjuntos de dados de milhões de registros quando precisar apenas de três no final. Portanto, uma visão de um nível de um conjunto complexo de junções para implementar DRY pode ser excelente (eu mesmo tenho uma que usamos para garantir que todos os relatórios financeiros usem o mesmo conjunto básico de tabelas e cálculos de certas coisas), mais de dois níveis e você precisa considerar se está criando uma bagunça no desempenho.