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

45

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 no 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.

Vetle
fonte
13
Eu também estaria interessado se algum defensor de colocar a lógica do aplicativo na camada do banco de dados puder fornecer métodos de teste de unidade dessa lógica do aplicativo.
precisa saber é o seguinte
@ChrisB: para Oracle existe plunit.com/index.htm
Tony Andrews
10
Lógica de negócios, por favor, não lógica de aplicação - o objetivo deve ser o domínio do problema, não a escolha da tecnologia!
Phil Lello
1
@ ChrisB: Eu aposto que eles podem - preencher tabelas com dados (você teria que criar classes simuladas na camada de aplicativos) e ligar para o SP automaticamente com um script. A coisa toda pode ser escrita como um script de instruções SQL, limpando e configurando conforme for. Aqui está um link para obter ferramentas de teste SQL 3 unidades: toadworld.com/BLOGS/tabid/67/EntryId/67/...
gbjbaanb
Eu escrevi meus pensamentos sobre isso no meu blog recentemente
Gaius

Respostas:

38

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.
Jaco Pretorius
fonte
5
Podemos adicionar também a capacidade de controlar os objetos conforme eles são modificados? Talvez seja apenas a minha queixa pessoal ... (sim, estou, obviamente, omitindo as maneiras que isso pode ser feito ...)
jcolebrand
6
Re: 4. Ótimo! Vamos usar que VB lógica em meu aplicativo Solaris Java ... oh, espere ...
Phil Lello
11
Phil, ótimo! Vamos usar a sua lógica Oracle no meu aplicativo SQL Server ... oh, espere ...
Craig
9
@Craig A realidade é que as organizações alteram os fornecedores de bancos de dados com muito menos frequência do que trocam aplicativos ou idiomas. No entanto, meu argumento foi mais que não é uma vantagem do app vs db, não que o db seja superior aqui; há prós e contras de cada abordagem
Phil Lello
1
@ jcolebrand - Bem, se você está desenvolvendo banco de dados , o VS 2010 é a bomba. Estou fazendo a transição do nosso grupo do SSMS para o VS para o trabalho de desenvolvimento e procurando adotar essa coisa de TDD que é toda a raiva dos desenvolvedores. É um investimento valioso de tempo para qualquer loja com trabalho significativo no desenvolvimento de banco de dados (e uma tendência para o SQL Server, é claro).
quer
11

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 como 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.

ChrisF
fonte
4
"não é tão simples como é com o código do aplicativo" por que não?
NimChimpsky
@ Nim - a menos que eu esteja fazendo errado, envolve projetos de banco de dados, em vez do simples "editar e verificar" que você obtém quando o controle de origem é integrado ao seu IDE.
ChrisF
1
Eu acho que porque você pode fazer alterações em seu banco de dados sem cometer-lo para controle de versão, mas você realmente não pode fazer o mesmo com o código ...
Jaco Pretorius
5
@Jaco Não, mas você pode executar / liberar código sem colocá-lo no SCM. O gerenciamento de versão superficial é o gerenciamento de versão superficial qualquer que seja a tecnologia usada.
Phil Lello
3
Se você fizer todas as alterações nos scripts, salve-as no diretório de controle de origem e faça o check-in e check-out como qualquer outro código.
HLGEM
8

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 do aplicativo para eliminar a necessidade de lidar com DBAs difíceis de trabalhar. É uma razão totalmente idiota, mas derivada da necessidade.

Walter
fonte
Expandir o tamanho da equipe já é bastante difícil, sem incluir alguém que não coopera (não sabe por que o responsável permite essa escolha) ou exige a sua própria 'sessão de tutoria' para mantê-los atualizados sobre os requisitos.
JeffO 22/09
1
Meu palpite é que, porque eles ficam sentados a maior parte do tempo sem fazer nada, então quando você finalmente dá a eles algo para revisar, eles querem realmente atrair a atenção. Talvez seja só eu ...
Jaco Pretorius
5
@ Jeff O Por que o DBA não estava envolvido no design? Os DBAs tendem a conhecer muito mais sobre otimização de banco de dados do que outros desenvolvedores e devem ser tratados como parte da equipe.
Phil Lello
8
@ Phil Lello: Porque a maioria dos desenvolvedores de software são xingamentos arrogantes que pensam que podem aprender tudo sozinhos. É por isso que tantos bancos de dados são pilhas tão ruins de lixo.
APENAS MINHA OPINIÃO correta
2
Parece que seu dba construiu uma cerca ao redor do campo minado para mantê-lo seguro. Seja grato!
James Anderson
7

Colocar a lógica da aplicação no banco de dados parece uma má ideia para mim. OTOH colocar 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 des 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.

BCS
fonte
Este. Você deseja que seu banco de dados seja resiliente. Portanto, a lógica vinculada aos seus dados deve residir lá.
Arkh
6

Depois de ler as duas perguntas, acho que todos 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 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.

HLGEM
fonte
4
Esta é a melhor resposta. Se a lógica de negócios estiver no aplicativo, se houver vários aplicativos usando lógica diferente, o banco de dados poderá terminar em um estado realmente ruim.
Sam
5

Longish. veja Resumo na parte inferior.

RDBMS

Um RDBMS significa sistema de gerenciamento de banco de dados relacional. É um sistema para gerenciar um banco 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 naqueles em 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 fazer 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 a ETL ao dataware para relatório, perfuração e 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. Isso é 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.

Sumário

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. A inclusão da lógica de negócios no banco de dados é ruim por sua longevidade e valor geral.

Embargo

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 sênior do SAS 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 computadores, então não vejo por que os programadores não gostariam de saber.

Mais tarde, depois de pensar sobre isso

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.

Christopher Mahan
fonte
5
Eu realmente não sigo o ponto de degradação do banco de dados; colocando a lógica no banco de dados, você só precisa alterar as regras em um único local (o banco de dados), não em muitos aplicativos escritos em vários idiomas. No entanto, +1 para uma resposta bem pensada.
Phil Lello 5/05
3
Devo salientar que muitos dos desenvolvedores que pensam que toda a lógica deve ir no aplicativo incluem a intergridade de dados. Essa é uma das razões pelas quais tantos bancos de dados têm pouca integridade dos dados. E o desempenho é um dos três fatores mais críticos para um banco de dados (junto com integridade e segurança dos dados); portanto, é claro que estamos preocupados com isso!
HLGEM
1
Os dados são tão bons quanto o aplicativo. Lixo no lixo e tudo mais. Se você tem, hum, pessoas menos precisas que escrevem os aplicativos, há muito pouco que você pode fazer como DBA para corrigir o lixo.
Christopher Mahan
1
@ChristopherMahan, há muito que você pode fazer no design do banco de dados para evitar dados incorretos.
HLGEM 6/03
4

Correndo o risco de parecer dramático, estou genuinamente horrorizado com a idéia de lógica do aplicativo no banco de dados. Muitas respostas aqui se concentraram nas vantagens de desenvolvimento de software; portanto, para facilitar, 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 Fortune 500 em que trabalhei tinham aplicativos escritos em pelo menos 25 idiomas, atingindo seu banco de dados OLTP. Alguns desses programas foram movidos para produção na década de 1970.

... 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 esse é provavelmente 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 supor que os dados sejam 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.

M. Smith
fonte
Bem dito. Meu grande problema com procedimentos armazenados, integridade referencial etc é o tratamento de erros. Muitas vezes, o usuário final é apresentado com o "procedimento de erro de mulching YYYY procedure XXXXXX - sqlcode -666", o que resulta em perda de tempo com chamadas de suporte. Quando um simples "cliente não possui identificação fiscal", o usuário pode resolver o problema e continuar seu trabalho.
James Anderson
3

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.

Maniero
fonte
3
É muito difícil para aplicação de construção de armazéns de dados agnósticos com lógica baseada em aplicativo
Phil Lello
3

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.

Nicolas de Fontenay
fonte
2

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?

LennyProgrammers
fonte
Todo o código do banco de dados deve estar no controle de origem em qualquer evento. É um código como qualquer outro.
HLGEM 6/03
1

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.

JeffO
fonte