[Dúvida] Back-End e Banco de Dados – Quem deve determinar o fluxo do projeto?
Olá pessoal. Há um certo tempo, tenho mantido uma base de dados que utilizo para armazenar informações e gerar relatórios à respeito do meu trabalho, só para contextualizar – sou professor de um curso de informática (acabo tendo que resolver quase todos os problemas relacionados à tecnologia) e toda semana preciso gerar um relatório a respeito da frequência dos alunos, um trabalho que seria feito "na mão" é rapidamente feito utilizando algumas queries em SQL; na época eu estava começando a estudar sobre Banco de Dados e ter criado uma base de dados foi muito útil para o meu aprendizado, trouxe agilidade e tranquilidade para o meu trabalho.
Visando facilitar a minha vida, estou pensando em criar um programinha simples (aka: CRUD) que rode de maneira local – a linguagem que me sinto confortável é o Java e para persistência de dados optei pelo SQLite por conta da sua simplicidade. No entanto, durante a criação das entidades peguei-me refletindo sobre a questão mencionada no título, eu devo programar "orientado" ao banco de dados ou o banco de dados que deve se adequar ao meu programa? Como posso prosseguir diante desse questionamento? Preciso voltar a fase de planejamentos?
Não há uma resposta definitiva, pode depender do projeto, do expertise da equipe, que ferramentas vai usar ou outros critérios.
É certo que todo sistema deveria começar pela estrutura de dados, e em muitos casos isso significa começar pelo banco de dados, seja no modelo físico ou no modelo lógico (algo que quase todo mundo ignora ou faz de outro jeito sem perceber). Mas hoje muita gente cria as estruturas de dados da aplicação e tenta encaixar o banco de dados nisso. Minha experiência é que isso tende a não dar bom resultado.
Mas ainda fica a questão de quem é mais importante para o projeto. Se não for possível determinar, eu iria pelo DB.
Por outro lado, em aplicações simples, e a maioria delas são simples, qualquer coisa funciona e fazer o mais simples costuma ser a melhor decisão. E por isso pensar demais sobre o problema pode ser um caso de overengineering.
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).
Meus 2 cents:
Uma dica que aprendi no inicio da carreira foi: quando for construir uma aplicacao, veja quais os relatorios (as saidas) que ela precisa gerar, mapeie os dados e parta dai.
OK, mantidas as proporcoes e devidas atualizacoes (afinal a dica eh dos anos 80) - sempre achei uma metodologia interessante: identificar primeiro no levantamento de dados quais as informacoes que de fato o usuario precisa para dai mapear a estrutura necessaria que o sistema devera ter.
Existe um monte de armadilhas aqui, como a possibilidade do usuario passar uma necessidade que eh apenas legada e nao real:
- A Experiência dos Cinco Macacos https://atitudereflexiva.wordpress.com/2020/04/02/a-experiencia-dos-cinco-macacos/
Entao: mapeamento de dados => BD => aplicacao.
Atualmente, nas experiencias de "vibe coding" com IA, tenho tentado o seguinte: criar um PRD descrevendo as tabelas e o que o sistema deve fazer e depois passar no replit/loveble/etc.
1. Exemplo de prompt "vibe coding" primeiro no chatGPT/deepseek/claude/quewn/etc:
Crie um PRD para o seguinte aplicativo:
Um app para atividade X: precisa ter uma landing page com botao de login. Apos o login devera abrir uma dashboard com menu vertical com as opcoes disponiveis.
O app precisa ter CRUD de users, roles e permission em tabelas separadas
O app precisa ter CRUD de XXX.
Descreva as tabelas e campos necessarios.
2. Com o PRD gerado acima, ai eh so passar no replit/lovavle/v0/etc e ver no que da
Vou falar da minha experiência. No início, quando eu estava aprendendo, me parecia muito mais natural programar orientado ao banco, tanto que eu começava pelo banco, era mais fácil pensar assim. Hoje em dia, depois de estudar mais, arquitetura limpa, arquitetura em camadas, etc, é o contrário. O banco, eu vejo apenas como uma tecnologia de persistência e acaba sendo uma das últimas coisas que faço no projeto. Antes disso, o código é todo orientado ao negócio, o famoso DDD. O core de tudo é o que o código faz, quais regras de negócio ele tem, quais validações, quais entidades(entidades de código, não de banco) fazem parte do negócio. O código funciona independentemente do banco. O banco apenas persiste e recupera os dados. Se amanhã, eu quiser deixar de usar um banco relacional pra usar um no-sql, eu simplesmente troco o adaptador do banco e uso outro, sem afetar o propósito da aplicação. O banco é apenas uma ferramenta, uma tecnologia de persistência. Mais do que isso até, a própria API, libs externas, infra, seu eu quiser eu troco por outra, eu troco sem grandes dificuldades. Toda a tecnologia que permeia o código, são mais detalhes de implementação do que algo que tenha a ver com que o código ou negócio, que é o principal.
E porque seria assim? O banco é "descartável", as coisas só estão ali porque a aplicação(quando tem uma aplicação), colocou. Poderia ser esse banco ou qualquer outro, as coisas, se fossem orientadas ao banco, seriam sempre diferentes. Mas o banco só serve pra persistir dados e nada mais. Já as regras de negócio da sua aplicação, elas só mudam se o negócio mudar, assim como o banco também deveria mudar. Por exemplo, você modela na aplicação que um usuário pra realizar determinada tarefa no seu site deveria ser maior de idade, isso é uma regra de negócio. Você então determina isso na aplicação, faz as validações implementando essa regra. Essa regra pertence ao domínio porque é uma ideia, uma regra de negócio, ela pertence ao "código" porque a regra é primária, ela não depende de como os dados são salvos. As restrções dos bancos devem servir apenas pra manter a normalização dos dados, aintegridade, a consistência dos dados, etc. Não interessa AO BANCO se um número tem que ser maior de "18 anos" ou não, aliás, o banco só trata um número, o conceito de restrição de IDADE, se trata de negócio/código.
Então se fosse pra ser curto e grosso, eu diria que o código é orientado ao negócio e vem antes de pensar sobre como os dados serão modelados ou salvos, o banco não é orientado a nada, só serve pra persistir. No seu caso, é como se o "código" estivesse na sua cabeça, você pensa que orientou algo aos dados, mas não, você orientou o banco à sua necessidade. O código faz isso, ele modela a sua necessidade, agora se é o banco A, B, com tecnologia X ou Y, se vai salvar na nuvem, na memória, no disco ou onde for, isso não interessa.
Cara, em sistemas robutos/corporativos, eu evitaria colocar qualquer tipo de trigger, stored procedure, etc no banco de dados. Pra mim tudo o que pode ser feito através da aplicação, deve ser feito através da aplicação.
Dito isso, se a sua dúvida é sobre alterar o esquema do banco de dados pra facilitar seu desenvolvimento, não vejo necessidade nisso, basta mapear os dados - os famosos DTOs (ou utilizar um ORM/Micro ORM). Acho que isso vai contribuir mais com o seu aprendizado.
Mas pelo que entendi, o projeto é pessoal e somente você vai utilizar o sistema. Então, meio que não importa, basta que funcione, rs.