OBSERVAÇÃO O público de programmers.se e dba.se é diferente e terá pontos de vista diferentes; portanto, neste caso, acho válido duplicar Quais são os argumentos contra ou para colocar a lógica do aplicativo na camada do banco de dados? em programmers.se.
Eu não consegui encontrar discussão sobre o dba sobre isso já, e o post original diz tudo, então:
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?
NB: Não sou o OP dessa pergunta, mas deixei o texto original intacto.
fonte
Respostas:
Pensamentos variados ...
O código do banco de dados sobreviverá à tecnologia do cliente do aplicativo. Pense no ADO.NET -> Linq -> EF, bem como em ORMs variados. Considerando que você ainda pode executar o código do SQL Server 2000 do último milênio em todas as tecnologias de cliente acima.
Você também tem o problema de vários clientes: eu tenho .net, java e Excel. São 3 conjuntos de lógica de aplicação.
"Lógica comercial" não deve ser confundida com "lógica de integridade de dados". Se você tem clientes iniciando transações e fazendo verificações variadas, são muitas chamadas de banco de dados e uma transação longa.
A lógica do aplicativo não é dimensionada para grandes volumes de dados. Temos 50 mil linhas por segundo usando procs armazenados. Uma equipe irmã que usa o Hibernate não consegue um por segundo
fonte
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 colocá-lo.
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.
A alternativa para implementar esse tipo de requisito no banco de dados é permitir que todos os programadores de aplicativos reimplementem tudo ou parte dele 100% corretamente, toda vez que acionam seu editor, desde o primeiro momento em que entram pela porta até a empresa sair o negócio.
Quais são as hipóteses?
Não é este o maior " não se repita " no planeta?
fonte
Estou movendo minha antiga resposta através do programmers.se não editada, pois as respostas parecem bastante polarizadas entre os sites.
fonte
A questão mais importante é se alguma 'camada' acima do banco de dados pensa que possui os dados. Simultaneidade e integridade dos dados são problemas para os quais a solução é um RDBMS - alguns aplicativos são desenvolvidos como se o banco de dados fosse apenas um depósito de bits pessoal e, é claro, eles acabam tentando reinventar a roda de várias maneiras, bem como sendo irreparavelmente quebrado assim que outro aplicativo acessar o mesmo banco de dados
fonte
Eu escrevi minha resposta para isso no meu blog . Minha conclusão é que fazê-lo no aplicativo simplesmente não aumenta quando você considera todo o ciclo de vida do aplicativo.
fonte
O SQL faz coisas como definir lógica e filtragem de resultados orientada a aplicativos? SQL é uma maravilhosa linguagem de manipulação de conjuntos.
Além disso, como o GBN apontou acima, o código SQL sobreviverá quase universalmente ao código do aplicativo.
Embora seja verdade que EF ou NHibernate ou LinqToSql ou o que quer que permita gerar código mais rapidamente, todo programador que se preze sabe que apenas a otimização do SQL otimiza a recuperação de dados. O RDBMS entende apenas SQL, então você precisa transformar tudo em SQL antes que tudo seja dito e feito. (supondo que possamos concordar que TSQL e PLSQL ainda são SQL)
fonte
Um golpe que as pessoas não estão necessariamente discutindo - os profissionais estão exaustos aqui - é o custo.
As CPUs no servidor de banco de dados são frequentemente as CPUs mais caras em qualquer organização, ao reduzir o custo da licença de software. Portanto, mover a lógica de negócios para a camada de dados é algo que deve ser feito criteriosamente, não necessariamente uniformemente.
fonte
É aqui que o encontro das mentes, ou seja, as mentes dos desenvolvedores (DVs) e DBAs, deve inevitavelmente acontecer. Trabalhar com Business Logic (BL) e armazená-lo em um banco de dados pode ter um impacto que pode glorificar ou horrorizar sua implementação.
Para alguns produtos RDBMS, existem bibliotecas / ferramentas / APIs superiores para lógica de negócios e infraestruturas de objetos que se pode aprender e empregar rapidamente em seus aplicativos. Para outros RDBMS, não existem bibliotecas / ferramentas / APIs.
No passado, os aplicativos de servidor do cliente transformavam o BL em procedimentos armazenados (SP). Para produtos como Oracle e SQL Server, isso foi feito mais cedo. Quando surgiram os bancos de dados de código aberto, como PostgreSQL e MySQL, aqueles que os utilizavam corriam o risco de abrir novos caminhos com procedimentos armazenados no BL. O PostgreSQL amadureceu rapidamente, pois não apenas os procedimentos armazenados foram implementados, mas também a capacidade de criar as linguagens dos clientes. O MySQL basicamente parou de evoluir no mundo dos procedimentos armazenados e veio em uma forma simplificada de uma linguagem com muitas restrições. Portanto, quando se trata de BL, você está completamente à mercê do MySQL e da linguagem Stored Procedure.
Resta apenas uma pergunta: independentemente do RDBMS, o BL deve residir no todo ou em parte no banco de dados?
Pense no desenvolvedor. Quando as coisas dão errado em um aplicativo, o processo de depuração fará com que o Desenvolvedor entre e saia de um banco de dados para seguir as alterações de dados que podem ou não estar corretas de forma intermitente. É como codificar um aplicativo C ++ e chamar o código Assembler no meio. Você precisa mudar do código fonte, classes e estruturas para interrupções, registros e compensações E VOLTAR !!! Isso leva a depuração para o mesmo nível.
Os desenvolvedores podem criar um método de alta velocidade de execução de BL em conjunto com configurações de linguagem (sinalizadores de compilador para C ++, configurações diferentes para PHP / Python, etc.) por meio de objetos de negócios que ficam na memória e não em um banco de dados. Alguns tentaram conectar essa ideologia a códigos de execução mais rápidos no banco de dados, escrevendo bibliotecas em que a depuração de Procedimentos armazenados e gatilhos está bem integrada no banco de dados e aparentemente utilizável.
Assim, o desenvolvedor é desafiado a desenvolver, depurar e manter o código-fonte e o BL em dois idiomas.
Agora pense no DBA. O DBA deseja manter o banco de dados enxuto e significar o máximo possível no domínio dos procedimentos armazenados. O DBA pode ver o BL como algo externo ao banco de dados. No entanto, quando o SQL solicita os dados necessários para o BL, o SQL precisa ser enxuto e mesquinho.
Agora, para o encontro das mentes !!!
O desenvolvedor codifica o SP e usa métodos iterativos. O DBA analisa o SP. O DBA determina que uma única instrução SQL pode substituir os métodos iterativos escritos pelo desenvolvedor. O desenvolvedor vê que a instrução SQL sugerida pelo DBA requer a chamada de outro código ou SQL relacionado ao BL que não segue os planos de execução normais da instrução SQL.
À luz disso, a configuração, o ajuste de desempenho e a codificação SP tornam-se uma função da profundidade e intensidade de dados do BL para recuperação de dados. Quanto mais profundidade e intensidade de dados o BL, mais Desenvolvedores e DBA devem estar na mesma página para a quantidade de dados e poder de processamento fornecidos ao Banco de Dados.
CONCLUSÃO
A maneira de recuperação de dados deve sempre envolver os campos Developer e DBA. As concessões sempre devem ser feitas sobre quais métodos de codificação e paradigmas de recuperação de dados podem funcionar juntos, para velocidade e eficiência. Se a preparação dos dados para o código-fonte manipular for feita apenas uma vez antes que o código obtenha os dados, o DBA deverá ditar o uso do SQL lean e médio. Se o BL é algo que o DBA não está em sintonia, as rédeas estão nas mãos do desenvolvedor. É por isso que o DBA deve se ver e fazer parte da equipe do projeto e não uma ilha para si mesmo, enquanto o Desenvolvedor deve permitir que o DBA faça o ajuste fino do SQL, se assim for necessário.
fonte
É uma boa pergunta para fazer em um site cheio de DBAs. Esperamos que a maioria das respostas seja "profissional" para manter o banco de dados em um estado ACID e, assim, manter a lógica comercial no banco de dados. :-)
Quanto à minha opinião, acho que você deve implementar a lógica de negócios em seus aplicativos e bancos de dados. Essa abordagem custará mais tempo e dinheiro, mas acho que ela terá uma solução comercial qualitativa melhor.
fonte
Como Adam Musch disse acima, há mais a considerar aqui para desempenho. Utilização do CPU. Uso de memória.
Bloqueie coisas obviamente erradas de acessar o banco de dados.
Quando você se aprofunda, é quando as decisões precisam ser tomadas. O servidor de banco de dados é um local muito caro para fazer coisas que o cliente poderia fazer facilmente. exemplo: formatação de dados, formatar datas, montar strings, etc. do lado do cliente.
Você faz as contas / processamento no cliente ou no servidor de banco de dados? Para mim, isso depende da complexidade e do número de registros envolvidos. A lógica de negócios deve realmente ser feita no próprio banco de dados para que tudo seja tratado da mesma maneira.
Você realmente deve criar uma API de visualizações para ler e procs armazenados para gravar os dados no banco de dados e evitar dores de cabeça no futuro.
Use os pontos fortes de cada extremidade em seu benefício.
fonte