Executando verificação de segurança...
4

Dúvida: Aplicações Modernas Ainda Dependem Muito Do Banco?

Olá, sou desenvolvedor .Net, já passei por duas empresas e em ambas as aplicações têem muita dependência do banco de dados no quesito de ter muitas procedures, funções, views, etc, que são chamadas em código e utilizadas. Se bem que são programas bem legados (se isso influencia de alguma maneira). Entendo que se uma operação precisa lidar com um número muito grande de dados, o fato de estar no banco, pode dar a aplicação uma perfomance maior. Contudo, gostaria de saber essa prática continua mesmo em sistemas mais modernos ou se isso são práticas que em geral não são mais adotadas no mercado.

Carregando publicação patrocinada...
3

Isso é uma das brigas que não tem fim na área.

Programador quase sempre vai usar o DB apenas como meio de armezenamento.

Isso tem inúmeras vantages e alguns desvantagens também.

O DBA vai preferir por tudo no DB. Claro aí estamos falando em um DBA com poderes para forçar isso na aplicação ou que o próprio programador é um DBA.

Também é algo que tem vantagens e desvantagens e muitas vezes você só vai descobrir muito tempo depois de ter adotada uma das estratégias.

Eu sou programador. Adivinha op que eu fiz em quase todos os meus sistemas?

Mas eu também já fiz um pouco da inteligência e organização do sistema estar no banco de dados, sem seguir as regras de DBA, ou seja, eu criei um mecanismo meu que ajudava na manutenção do sistema e mesmo tendo muita informação do sistema no DB, era redundância, documentação, formas de facilitar algumas tarefas e operações, não era o uso dos mecanismos típicos de um DB. Eu não gosto de quase nenhum mecanismo básico dos SGDBs existentes em relação a qualquer coisa além do storage e otimização de acesso. È uma resposta universal? Não.

Aí vem outras questão junta na maioria das vezes. Devo fazer para funcionar com um banco de dados específico e otimizar ao máximo para ele, usar recursos que só tem nele, e portanto você praticamente cai no banco da dados ajudando muito, mas talvez menos do que você imagina.

Quem faz para rodar em vários bancos de dados diferentes, ou porque ele vend para várias empresas que ele precise se adaptar, ou porque ele tem uma necessidade muito específica, muito rara, ou porque ele não entende o que está fazendo e acha que vai se dar bem com essa flexibilidade que só funcionará tirando todo poder do DB e passando para a aplicação, ou seja, você vai jogar fora os mecanismos de otimização de cada um dos DBS (bem, você pode fazer a otimização para cada um, mas aí é fazer 3, 5 , 10 sistemas diferentes).

Pior são os casos que o cara deixa mais genérico porque se o DB não der conta do recado ele pode trocar de DB. E vira uma profecia auto-realizável, porque como ele faz genérico, não otimiza, fica ruim e talev ele tenha que ttrocar de DB. Talvez não porque a troca pode pegar 6 no lugar de meia dúzia ou nem isso. Se quer garantir escalabilidade use os recursos do seu DB, não faça genérico, escolha um e seja feliz, tem todos os tamanhos de site rodando MYSQL/MariaDB, PostgreSQL, SQL Server, Oracle, DB2 e muitos rodando até em Firebase ou SQLite (cada dia mais), embora esses últimos são mais arriscados. Você estará bem com qualquer um deles se souber programar bem e entender um pouco de DB, especialmente o que escolheu.

Não tem solução mágica, se tá lento, é porque você fez tudo mal feito.

Claro que tem uns casos que pode ser que preci de um bando de dados de documento como o MongoDB ou um de grafo. Mas os recursos que esses DBS têm existem nos relacionais também. Qualquer relacional vai atender qualquer demanda mesmo que o DB seja quase só esse modelo diferente do relacional? Não, mas para a maioria dos casos vai atender bem, mesmo tendo que fazer algumas adaptações e não ter o máximo da eficiência. Aí tem que pensar, mas raros os DBs que não devam ser relacionais. De qualquer forma se não for relacional, espere fazer tudo na aplicação, a maioria não costuma deixar nada para ser feito dentro dele.

Stored Procedured é bom? EM alguns casos ele pode fazer alguma diferença, mas é raro, porque pensa bem, se você fizer uma query de um jeito e fizer a mesma coisa dentro de uma SP, porque a SP será mais eficiente? Ambas executarão dentro do banco de dados. A transmissão e compilação de uma query solta não fará cócegas no DB em comparação com a SP. E se fizer diferença, o problema era tão bobo que tanto faz o que você usou. A query só será mais lenta que a SP se a comparação não for justa, ou seja, a SP tá feita direito e a query enviada pela aplicação está ruim. Tudo que pode fazer em uma pode fazer na outra, mas tem alguns casos que fazer em uma SP pode see mais fácil de criar a query (porque uma SP não deixará de ser uma query em qualquer situação que valha comparar). Tem caso que não é fácil pegar dados variados de uma vez só com uma query, ela pode ficar complexa, exigir um DBA/programador que manje mais daquele SQL, e na SP pode ficar um pouco mais fácil porque você pode fazer em etapas, mantendo estado.

Se tá tudo funcionando a contento, não tem muito porque mexer. Mas cada casos é um caso.

O resto é organização de código.

Uma coisa que eu abomino, mas aceito em sistemas simples é usar o DB como API. E quem usa o jeito mais de DBA de programar costuma fazer mais isso. È dar tiro no pé em sistemas complexos com grande manutenção, você vai se perder, vai ter que fazer gambiarra para funcionar para as várias necessidades diferentes de consumo dessa API. Acredite tenho experiência nisso, e o sistema mais famosos que faz isso tem a maioria dos seus problemas, reclamações, custosos altos de manutenção por causa disso. EU sei bem, eu trabalhei nele. Nâo sei quantas pessoas tiveram a oportunidade de trabalhar com algo nessa escala e ver os sofrimentos e como seria mais fácil se tivessem optado pelo jeito certo.

Então já que a API será entregue por código de aplicação, deixa o DB mais limpo, só use recursos que permitam claro ganho no acesso.

Cuidados co modinhas, muita coisa é usada só porque tem gente dizendo que é bom. E ou é só para ele ou nem isso é, é só um hoax que foi longe demais. Nunca coloque nada no seu sistema sem ter certeza que dará ganhos e compensará os prejuízos. Não coloque porque os outros estão colocando, a tal ada modinha.

Cada operação nova tem que ser pensada para usar o que é melhor, não siga receitas de bolo. Nunca coloque algo que você não precisa muito usar. Não crie complexidade para dizer que é moderno.

Meça de todos os casos, o que pode ser verdade aqui pode não ser ali.

De qualquer forma é o que eu falo, você precisa aprender toda a computação para tomar decisões certas, se apenas copia o que disseram para você fazer tem grande chance de cometer um erro.

S2


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui no perfil também).

2

Meus 2 cents,

Pela minha experiencia, a resposta é: "depende" (pois é, não ajudou nada)

Comentário sobre dependência de bancos de dados em aplicações modernas

Sua pergunta é muito pertinente e reflete uma discussão que está presente no desenvolvimento de software há anos. A prática de concentrar lógica de negócio em procedures, funções e views é uma abordagem que evoluiu ao longo do tempo, com diferentes práticas sendo adotadas dependendo do contexto.

Pontos-chave para analisar essa situação:

  1. Contexto de sistemas legados: É comum em aplicações mais antigas encontrarmos grande parte da lógica implementada no banco de dados. Isso ocorre por questões históricas de desempenho (quando a capacidade de processamento era mais limitada) ou porque essa era a abordagem dominante no momento da criação desses sistemas.

  2. Vantagens da lógica no banco:

    • Desempenho: Realmente, como você mencionou, operações que envolvem grandes volumes de dados se beneficiam muito de serem processadas diretamente no banco, evitando a transferência massiva de dados pela rede.

    • Atomicidade e consistência: Procedimentos armazenados garantem transações atômicas e integridade referencial.

    • Redução de duplicação: A mesma lógica pode ser reutilizada por múltiplos sistemas clientes.

  3. Tendências modernas:

    • Separação de responsabilidades: As arquiteturas modernas tendem a seguir o princípio da responsabilidade única, com a camada de negócios separada da camada de dados.

    • Umassive de ORMs: No ecossistema .NET, o Entity Framework e outros ORMs facilitaram a abstração do SQL, permitindo que a lógica de negócio fique no código da aplicação.

    • Testabilidade: Code-first e testes untários facilitam com que a lógica de negócio seja testada de forma independente do banco.

    • Padrões modernos: Arquiteturas como CQRS (Command Query Responsibility Segregation) muitas vezes separam leitura (queries) e escrita (commands), com queries sendo otimizadas no banco.

  4. Quando ainda é válido manter lógica no banco:

    • Operações complexas que envolvem múltiplas tabelas e grandes volumes de dados
    • Lógica para geração de relatórios complexos
    • Processos em lote (batch)
    • Auditoria e triggers para manter consistência
    • Views para abstrair consultas complexas que são frequentemente reutilizadas

Conclusão

Não se trata mais de uma prática "descontinuada", mas sim de uma mudança de paradigma: os sistemas mais modernos tendem a colocar menos lógica no banco e mais na camada de aplicação, mantendo apenas os casos onde isso realmente traz benefícios claros.

Se você está trabalhando com sistemas legados, é natural encontrar essa concentração de lógica no banco. No entanto, ao desenvolver novos sistemas, é comum encontrar uma abordagem mais balanceada, onde:

  • A camada de negócios fica na aplicação
  • O banco é responsável pela persistência e integridade dos dados
  • Procedures e funções são usados estrategicamente para casos específicos de performance ou complexidade

A verdade é que a melhor abordagem depende sempre do contexto do projeto, das equipes envolvidas e das necessidades específicas da aplicação.

Saude e Sucesso !

1

Primeiramente, muito obrigado por compartilhar seu conhecimento sobre.

Entendi, faz bastante sentido que o uso hoje em dia seja mais reduzido em tese por causa dos testes que acredito que seja mais complicado para fazer com procedures gigantes do banco e CQRS que segrega essas responsabilidades. Muito massa!

2

Em todas as aplicações que ja trabalhei o banco é sempre o gargalo. A maioria das técnicas de modelagem de dados focam em diminuir a carga sober o banco.

Quanto a procedures e funções os desenvolvedores evitam ao máximo criar por conta da dificuldade de manter. Em empresas gigantes há uma equipe especializada apenas em manter funções no DB.

1

Pois é, lá onde trabalho sempre que precisamos mexer em algumas procedures maiores é um parto para fazer uma coisa simples, porque até para "debuggar" é uma coisa mais demorada. hehehe!!

Valeu demais!

1

Meus 2 cents,

Sim, este eh um detalhe importante: quanto mais atividades especializadas delegadas ao banco (STORED PROCEDURES, TRIGGERS, etc), acaba sendo interessante o DBA focado nesta manutencao.

Um detalhe curioso eh que os ORMs deixaram os DEVs mal-acostumados: entrega ao ORM a tarefa de recuperar os dados e que se dane a construcao de SQL - so que isso acaba tendo um custo de queries mal feitas ou repetidas, ausencia de JOINs/UNIONS/SUBSELECTs que poderiam otimizar a recuperacao de dados. Usar o EXPLAIN acabou se tornando uma habilidade perdida.

Ainda nos anos 90 acabei por tirar certificacao DBA em Oracle para aprender as "bruxarias" de otimizacao de query - ja que nao tinha poder de processamento e discos rapidos, acaba tendo de otimizar em tablespaces, forcar uso de indices, criar bitmaps de dados, enfim (quando lembro que rodava servidor Oracle com RAM 128Mb - mega e nao giga ! - e tinha de gerenciar alguns milhoes de linhas e ser rapido).