ti-enxame.com

Quais são os argumentos contra ou para colocar a lógica do aplicativo na camada do banco de dados?

A maioria dos desenvolvedores de software deseja manter a lógica do aplicativo na camada de aplicativos e provavelmente parece natural mantê-lo aqui. Os desenvolvedores de banco de dados parecem querer colocar a lógica do aplicativo na camada do banco de dados, como gatilhos e procedimentos armazenados.

Pessoalmente, eu preferiria manter o máximo possível na camada do aplicativo para facilitar a depuração e manter as responsabilidades das camadas separadas.

O que você pensa sobre isso e o que deve ou não ser aprovado para implementar na camada de banco de dados?

Editar Esta questão também é abordada em dba.se , da perspectiva dos DBAs. Como programmers.se e dba.se têm públicos e vieses diferentes, os futuros leitores podem revisar os dois conjuntos de respostas antes de decidir o que funciona melhor para eles.

45
Vetle

Em cima da minha cabeça, vantagens de colocar lógica na camada de aplicação.

  1. testabilidade. Este deve ser um motivo suficientemente bom por si só, na verdade.
  2. Melhor estrutura de código. É muito difícil seguir a arquitetura OO adequada com o SQL. Isso geralmente também facilita a manutenção do código.
  3. Mais fácil de codificar. Devido a todos os diferentes recursos de idioma disponíveis em qualquer idioma que você esteja usando, geralmente é mais fácil codificar na camada do aplicativo.
  4. reutilização de código. É muito mais fácil compartilhar código com bibliotecas do que compartilhar código no banco de dados.
38
Jaco Pretorius

Embora seja possível usar o controle de versão com procedimentos armazenados (por exemplo, as ferramentas de banco de dados Redgate se integram ao TFS), nem sempre é tão simples quanto no código do aplicativo.

Minha posição padrão é que a lógica deve ser mantida fora da camada do banco de dados; no entanto, há momentos em que seria mais eficiente implementar a lógica no banco de dados. Se for esse o caso, você deve acompanhar as alterações neste código.

11
ChrisF

Em uma empresa em que trabalhei, havia muita burocracia envolvida na liberação de código para produção e o envolvimento de um DBA para liberação de código sempre foi um pesadelo. Sempre colocamos a lógica na camada de aplicativo para eliminar a necessidade de lidar com DBAs difíceis de trabalhar. É uma razão totalmente idiota, mas derivada da necessidade.

8
Walter

Colocar a lógica application no DB parece uma má ideia para mim. OTOH colocar a lógica no banco de dados que faz parte especificamente da manutenção do estado do banco de dados (por exemplo, gatilhos/sprocs para atualizar tabelas não normalizadas) é uma proposta muito diferente.


Como alternativa, isso pode ser declarado da seguinte maneira: existem bons argumentos para colocar a lógica necessária para abstrair como o banco de dados realmente funciona e como você deseja que ele procure no banco de dados.

7
BCS

Depois de ler as duas perguntas, acho que todos nós perdemos um ponto crítico. A resposta correta pode depender do tipo de software que você está desenvolvendo. O grupo DBA tende em grande parte a trabalhar em sistemas de software corporativos críticos para os negócios e suas respostas tendem a refletir o que é necessário nesse mundo. Há uma enorme diferença entre o que é necessário para esses tipos de aplicativos e o que é necessário para o próximo aplicativo "Facebook". Não é grande coisa se você perder alguns posts no mural, é se você perder alguns pedidos ou outras transações financeiras.

As pessoas que trabalham no mundo COTS (comercial fora da prateleira) tendem a precisar ser independentes de banco de dados por motivos de vendas e desejam que tudo no código cumprido torne mais difícil a engenharia reversa e a substituição de seu produto por um produto caseiro. Os aplicativos corporativos desenvolvidos e mantidos internamente quase nunca precisarão alterar os back-ends do banco de dados, exceto a atualização.

Os aplicativos corporativos também são os que tendem a ter entradas de vários locais, sendo o único banco de dados o banco de dados. O sistema em que trabalho tem centenas de aplicativos diferentes acessando-o, bem como centenas de importações de dados de clientes, exportação de dados para clientes e para data warehouses e usa sistemas de relatórios múltiplos. O código que funciona bem ao adicionar um registro falha quando preciso importar 20.000.000. Fomos forçados a usar a camada de aplicação uma vez, porque era aí que estava a lógica e tivemos que interromper o processo 18 horas depois, inacabado. A lógica que deve ser aplicada a todos os registros de dados em uma tabela precisa estar no banco de dados quando você não pode ter uma camada de dados que todos usem.

Por outro lado, quando apenas um aplicativo consome os dados e os dados não são a força vital da sua empresa ou são efêmeros, as regras são diferentes e colocar toda a lógica no aplicativo faz mais sentido.

6
HLGEM

Longish. veja Resumo na parte inferior.

RDBMS

Um RDBMS significa sistema de gerenciamento de banco de dados relacional. É um sistema para gerenciar uma base de dados relacional. Os dados são armazenados lá. Os dados. Não diz lógica de negócios.

Processo de negócio

O que realmente significa lógica de negócios? Para mim, é uma descrição dos processos de negócios em termos lógicos.

Processos são aquelas atividades de negócios que ocorrem regularmente, o suficiente para que não sejam mais ad hoc. Estes são diferentes para cada empresa.

Deixe-me colocar meu limite de negócios e explicar o que são negócios aqui. Para alguns, isso pode ser uma surpresa.

O negócio

Negócio é a soma das atividades executadas para alcançar a criação de valor e, mais especificamente, o valor que pode ser negociado. Isso pode significar fazer colheitadeiras, sanduíches de atum ou fornecer serviços bancários. Na maioria dos países do mundo, mesmo nos sistemas não-capitalistas, as pessoas gostam de obter o melhor valor pelo seu dinheiro, e, portanto, existe concorrência entre diferentes fornecedores desses bens e serviços valiosos. A competição geralmente depende de preço, qualidade e disponibilidade.

Desvio rápido: você precisa de 40 milhões de rebites em 2 dias, não vai pedir de um cara na Internet com uma conta Paypal, não importa o preço mais barato que o preço normal do seu fornecedor.

Processo de Conhecimento

Como você pode imaginar, os processos envolvidos para tornar esse "valor" residem principalmente nos chefes executivos. Parte disso é colocada no papel e usada como políticas e procedimentos da empresa. Parte disso mora nos chefes de consultoria corporativa. Muito disso vive na cabeça das pessoas que dirigem as divisões, departamentos, equipes e pessoas que administram as máquinas, as caixas registradoras, os fornos, os caminhões. Um pequeno subconjunto disso diminui os requisitos comerciais de software, e um subconjunto ainda menor é preciso quando é implementado em sistemas de computadores.

No final, a lógica de negócios que você vê no código não é a que administra um negócio, é a que executa o aplicativo para o negócio. O cérebro real dentro de pessoas reais mantém os processos de negócios reais e eles não têm problemas para entender que o processo em seu cérebro é mais preciso do que o processo no computador. Como um aparte, você provavelmente não poderia administrar o negócio se tudo o que tinha fosse as políticas e procedimentos da maioria das empresas. Muitas vezes, essas informações são imprecisas, apesar dos esforços hercúlicos.

Portanto, no final, é a lógica do aplicativo que está codificada no software. E as pessoas querem colocar isso no banco de dados, porque os fornecedores de sistemas de gerenciamento de banco de dados fizeram reivindicações grandiosas.

Lógica de Aplicação

Eu disse não. Eu digo que a lógica do aplicativo permanece dentro do aplicativo. Os dados vão para o banco de dados, de uma maneira muito normalizada, e depois encaminham o ETL ao datawarehouse para geração de relatórios e perfuração, rollup, rotação e cubagem.

Dados

Eu também digo que os dados sobrevivem ao aplicativo, portanto o esforço de normalização de dados não deve ser específico do aplicativo e nem mesmo específico do negócio, mas deve ser geral do negócio. Você armazena códigos de estado? Você deve usar o INCITS 38: 2009 (http://www.census.gov/geo/www/ansi/statetables.html) porque é portátil nas empresas. Isso também facilita a manipulação de vários aplicativos pelos dados.

NoSQL?

Se você tratar o banco de dados como parte do código do aplicativo, do layout das tabelas aos gatilhos, procedimentos armazenados e formatos de dados, estará basicamente usando o banco de dados corporativo como um BerkleyDB glorificado, que é uma estrutura de arquivos simples glorificada, que são realmente apenas listas persistentes. Isto é essencialmente o que o NoSQL está fazendo: voltando às raízes, mas fazendo isso de maneira multi-processo, persistente e tolerante a falhas.

Código atual

Não, você precisa tratar o banco de dados como um repositório comum de dados para vários aplicativos, atuais e futuros. Agora chegamos ao cerne da minha discussão. Os processos de negócios mudam com os caprichos do mercado, da política e da moda. Muitas vezes, eles mudam mais rapidamente do que o que os codificadores podem gerenciar com linguagens de nível de ciência da computação (Java, C #, C++ etc.) e acabam sendo escritos em VBA em planilhas do Excel no departamento de contabilidade ou marketing. (E somente se não puder ser expresso em visualizações sofisticadas ...)

Degradação de banco de dados

Os dados não mudam muito se estiverem bem organizados. A lógica de negócios muda muito rapidamente. Ao colocar a lógica comercial no banco de dados, você o torna menos valioso, porque se tornará obsoleto e impreciso mais cedo.

Resumo

Os dados devem sobreviver ao aplicativo porque os processos de negócios vivem no aplicativo e os processos de negócios mudam com muito mais frequência. Incluir lógica de negócios no banco de dados é ruim por sua longevidade e valor geral.

Embargo

Eu fiz minha parte no dba-ing e li as respostas no dba.se, mas com toda a honestidade, o que eles estão falando são problemas de integridade de dados e problemas de desempenho. Concordo plenamente que as pessoas que tocam em dados corporativos devem saber o que estão fazendo, seja dba ou programador ou analista SAS sênior com acesso de leitura/gravação.

Também observei que eles recomendam que os codificadores conheçam SQL. Concordo. É uma linguagem de programação de computador, então não vejo por que os programadores de computador não gostariam de saber.

Mais tarde, depois de pensar sobre isso

Eu acho que o meio termo é criar uma API e fazer com que essa API gerencie o fluxo de dados para lá e para cá. Se você não pode permitir que os aplicativos se conectem diretamente às tabelas, pelo menos você pode fazer com que o mecanismo de acesso esteja em idiomas modernos.

5
Christopher Mahan

Correndo o risco de parecer dramático, estou genuinamente horrorizado pela idéia de lógica do aplicativo no banco de dados. Muitas respostas aqui se concentraram nas vantagens de desenvolvimento de software, portanto, por uma questão de brevidade, vou me concentrar nas vantagens geradas pela divisão de responsabilidades.

Os bancos de dados fornecem um meio eficiente de armazenar e acessar informações, minimizando dados redundantes e produzindo relacionamentos lógicos nos dados. Embora a lógica do banco de dados possa ser capaz de implementar a lógica de negócios no nível da produção, minha opinião pessoal é que o banco de dados deve ser o mais independente de aplicativo possível para garantir que os dados possam ser efetivamente aproveitados por vários aplicativos enquanto reproduzem os respectivos pontos fortes do banco de dados mecanismo versus os pontos fortes da linguagem de implementação do aplicativo.

Um usuário na troca de pilhas do DBA declarou isso ...

Eu quero toda a lógica que deve ser aplicada a todos os usuários e todos os aplicativos no banco de dados. Esse é o único lugar sensato para colocar.

As últimas empresas listadas na Fortune 500 tinham aplicativos escritos em pelo menos 25 idiomas, atingindo seu banco de dados OLTP.

... Seguido por sua crença de que isso é indicativo de uma violação do princípio DRY.

Em vez de ser uma repetição da lógica de negócios, acho que este é mais um exemplo perfeito da flexibilidade fornecida por uma divisão distinta de responsabilidades entre a camada de negócios e a camada de dados.

Seu banco de dados OLTB fornece dados de maneira confiável e eficiente para mais de 25 aplicativos há décadas! Isso é incrível! (Caminho a percorrer!)

Só posso assumir que os dados são agnósticos o suficiente para fornecer conteúdo para vários aplicativos distintos. Algo que seria praticamente impossível se esses desenvolvedores tentassem hackear algo usando a lógica do banco de dados.

Como outras respostas indicaram, existem muitos outros motivos para não implementar um programa no banco de dados. Tenho certeza de que funcionaria, mas o resultado mais provável seria décadas de arrependimento, em vez de décadas de estabilidade.

4
M. Smith

Os aplicativos independentes de banco de dados requerem toda a lógica dos bancos de dados. É muito difícil criar e manter código para muitos provedores de bancos de dados diferentes.

3
Maniero

Um bom desenvolvimento encontrará um bom equilíbrio entre a necessidade de integridade e velocidade do banco de dados, colocando parte da lógica no banco de dados e a maior parte no aplicativo.

A mesma consulta será usada repetidamente em vários aplicativos e talvez ela pertença a um procedimento armazenado.

Garantir que os campos de manutenção da casa sejam definidos quando uma linha é inserida e atualizada é uma responsabilidade do DBA. Um gatilho será usado.

Por outro lado, se eu tiver lógica de negócios, ela precisará estar no aplicativo. Quando possível, faça chamadas para procedimentos armazenados que retornarão o conjunto de registros filtrados desejado com a quantidade exata de campos necessários. Nem mais, nem menos.

É uma questão de comunicação entre equipes e uma questão de reconhecer os prós e contras de cada possibilidade.

Minha opinião é: não torne a lógica do aplicativo muito profunda no DB.

3
Nicolas de Fontenay

Alguns sistemas de negociação fornecem uma maneira de estender a funcionalidade existente com scripts, basicamente colocados no banco de dados. Minha experiência com isso é bastante negativa, pelo menos em uma configuração multiusuário.

Você colocaria lógica em um banco de dados, porque gostaria de poder modificá-la facilmente.

  • Como você faria o controle de versão?
    • Qual é o histórico do código? Quais foram as mudanças? Por quem?
    • Como você lida com as alterações nos mesmos fragmentos de código?
  • Como você identificaria e garantiria um estado de código consistente?

Você pode acompanhar isso em um VCS adicional baseado em arquivo, mas qual é o benefício do banco de dados?

2
LennyProgrammers

A maioria dos aplicativos precisa ter alguma maneira de fornecer integração. Idealmente, você teria uma API completa, um serviço da Web ou pelo menos disponibilizaria alguns objetos de banco de dados que contenham lógica de negócios. Todo mundo não está em uma posição de tempo/recurso para criar uma API, então você precisa se comprometer.

1
JeffO