Código primeiro x banco de dados primeiro

77

Quando projeto e crio o software em que trabalho, normalmente projeto e crio as tabelas SQL de back-end primeiro e depois passo para a programação real. No entanto, o projeto no qual estou trabalhando me deixa perplexo. Provavelmente, isso se deve à falta de requisitos sólidos e bons, mas, infelizmente, pouco posso fazer sobre isso dessa vez. É um tipo de situação "vá em frente, faça acontecer" ... mas eu discordo.

Estou pensando em inverter meu fluxo de trabalho e criar a interface do usuário e as classes de modelo de dados primeiro, na esperança de que, com isso, fique claro para mim como será meu esquema de banco de dados. isso é uma boa ideia? Estou nervoso porque vou acabar com uma interface do usuário e ainda não faço ideia de como estruturar o banco de dados.

Se alguém estiver curioso, estou usando o SQL Server como back-end e o MS Access como um aplicativo front-end. (O acesso também não é minha escolha ... então, por favor, não odeie muito isso.)

Pato de borracha
fonte
6
@gnat: Isso é completamente diferente.
Robert Harvey
1
Se isso for fechado como duplicado, deve ser uma duplicata desta pergunta . As respostas e perguntas estão mais alinhadas com o que estou perguntando.
RubberDuck
1
@Mawg é um projeto de trabalho. Eu recuei o máximo que puder sobre a fixação dos requisitos. O trabalho tem que começar com isso e não há mais nada que eu possa fazer sobre isso.
precisa
4
Errrm, novo emprego? Eu sei que sim. Porém, como freelancer de 30 anos, acho fácil ir embora antes que realmente chegue ao fã (algumas pessoas você simplesmente não pode ajudar), mas percebo que não é tão fácil para todos. Fique se for necessário (nenhum empregador comparável) na área, etc), mas não fique se ele começa a afetá-lo.
MAWG

Respostas:

85

O que veio primeiro, o processo ou os dados usados ​​por esse processo? Sei que essa é uma pergunta do tipo "galinha ou ovo", mas no caso de software, acredito que seja o processo.

Por exemplo, você pode construir seu modelo de dados incrementalmente implementando um único caso de uso de cada vez com apenas persistência na memória (ou algo tão fácil de implementar). Quando achar que implementou casos de uso suficientes para descrever as entidades básicas, você pode substituir a persistência na memória por um banco de dados real e continuar refinando o esquema à medida que avança, um caso de uso por vez.

Isso retira o foco do banco de dados e o move para o núcleo do problema: as regras de negócios. Se você começar a implementar as regras de negócios, encontrará (por um processo muito semelhante à Seleção Natural), que dados são realmente necessários para os negócios. Se você começar modelando o banco de dados, sem o feedback sobre se esses dados são realmente necessários (ou nesse formato, ou nesse nível de normalização, etc ...), você terminará fazendo muitos ajustes tardios no o esquema (que pode exigir procedimentos pesados ​​de migração, se a empresa já estiver em execução), ou você precisará implementar "soluções alternativas" nas regras de negócios para compensar o modelo de dados desafinado.

TL; DR: O banco de dados depende dos negócios - é definido por eles. Você não precisará dos dados, a menos que tenha um processo que os opere (um relatório também é um processo). Implemente o processo primeiro e você encontrará quais dados eles precisam. Modele os dados primeiro e você poderá contar quantas suposições estavam erradas quando o modelou pela primeira vez.

Um pouco fora do tópico, mas muito importante: o fluxo de trabalho que descrevo é frequentemente usado junto com práticas muito importantes, como "A coisa mais simples que poderia funcionar", desenvolvimento orientado a testes e foco em separar sua arquitetura dos detalhes que fique no seu caminho (dica: banco de dados). Sobre o último, essa palestra resume muito bem a ideia.

MichelHenrich
fonte
1
"O banco de dados é um detalhe". Muito obrigado pelo link. Eu sinceramente acredito que poderei enfrentar esse projeto deixando o banco de dados como uma decisão adiada depois de assistir a essa conversa.
RubberDuck
6
E só para colocar um nome: essas práticas são todas (sem dúvida as ) práticas importantes no desenvolvimento Agile (desenvolvimento incremental, a coisa mais simples que poderia funcionar, orientada a testes, as necessidades do usuário primeiro ...).
sleske
8
Eu queria voltar e agradecer novamente. Eu tenho toda a camada intermediária trabalhando sem um banco de dados e agora tenho uma ótima idéia de como os dados devem ser mantidos. Não posso agradecer o suficiente. Eu votaria novamente se pudesse.
precisa
12
Se você realmente capturar todos os requisitos por meio do método de primeiro código e expressar todos esses requisitos em seu banco de dados final , posso concordar com esta resposta. Mas já vi muitos projetos em que a satisfação de obter algo "funcionando" resulta na atitude de que "se estiver funcionando, o banco de dados deve ser bom o suficiente", mesmo quando é um design HORRÍVEL , com problemas de desempenho inevitáveis ​​e sérios. mais tarde. Além disso, muitas pessoas parecem pensar que, se o código está validando dados, você não precisa das restrições CHECK ou FOREIGN KEY. Você faz .
Ross Presser
2
É possível que isso seja abordado no vídeo - infelizmente não posso chegar agora -, mas outra vantagem da abordagem incremental é que, quando feita corretamente, ajuda a solidificar especificações vagas. "Essa tela parece estar capturando todas as informações de contato que você precisa? Os campos estão organizados em uma ordem que faz sentido com o seu fluxo de trabalho?" Ser capaz de fazer essas perguntas - com algo de concreto como referência - é o IME frequentemente a única maneira de obter as informações necessárias.
David
17

Uma análise de causa raiz sugere que esse problema não é do método, mas é a falta de uma especificação. Sem um, não importa realmente o que você escreve primeiro - você vai jogá-lo fora de qualquer maneira.

Faça um favor a si mesmo e faça algumas análises básicas dos sistemas - identifique alguns usuários em vários níveis, faça um questionário rápido e sujo, depois desligue sua máquina, pegue um café e biscoitos / rosquinhas (ou o que lubrifica as rodas) e caminhe até em suas mesas, pergunte a eles o que fazem e o que precisam saber / registrar para realizar seu trabalho, mesmo que pareça óbvio - ainda pergunte. Não se preocupe com a importância deles, se estiverem muito ocupados, faça um acordo para voltar outra vez ou deixe com eles.

Depois de ter isso, você poderá começar a criar o que acha que lhe dará os melhores resultados e aguardar o restante da especificação.

James Snell
fonte
Eu concordo plenamente, mas isso não vai acontecer neste caso. Obrigado pelo seu tempo.
RubberDuck
9
Se você não tiver tempo para fazer o que é certo, onde encontrará tempo para fazer isso de novo?
Walter Mitty
Quem disse algo sobre não fazer direito @WalterMitty? Por favor, veja o link do vídeo na resposta aceita. O banco de dados é um detalhe que não precisa estar no local para solucionar os problemas de 95% do software.
precisa
1
Peguei "isso não vai acontecer" para significar que você vai continuar codificando sem nem uma pista sobre quais informações as partes interessadas precisam do sistema. Eu acho que James deu bons conselhos para você fazer análises básicas de sistemas sem se deixar levar pela paralisia da análise.
Walter Mitty
Você me entendeu mal @WalterMitty. Adotei uma abordagem de loop de feedback. Vou construir o que acho que deveria (sem um banco de dados) e depois levá-lo aos usuários. Modifique o programa. Repetir. Após algumas iterações disso, eu deveria saber exatamente como será o banco de dados. Pelo que entendi, a abordagem Agile foi projetada especificamente para lidar com requisitos pouco claros. Está bem em mim neste projeto.
precisa
12

Minha experiência é a seguinte:

  • Na maioria dos projetos em que trabalhei, projetamos o banco de dados primeiro.
  • Muitas vezes, os dados já existem em planilhas, bancos de dados herdados, documentos etc. Esses dados fornecerão dicas sobre as tabelas necessárias para armazená-los.
  • Muitas vezes, um processo já está sendo usado, mas manualmente ou usando várias ferramentas diferentes que não são automatizadas, não interoperam e / ou não estão em conformidade com os padrões.
  • Depois de ter um modelo de banco de dados semi-maduro, você pode começar a projetar formulários de protótipo, janelas etc., que leiam e gravam nesse banco de dados.
  • Enquanto você continua, algumas mudanças serão necessárias para acomodar as coisas que não foram contempladas a princípio.

Lembre-se também:

  • Já não é um mundo de um aplicativo <-> de um banco de dados. Talvez seu aplicativo precise ler ou gravar dados de mais de um banco de dados ou sua solução compreenda mais de um aplicativo usando o mesmo banco de dados.

Conclusão: eu recomendo que você crie o banco de dados primeiro.

Tulains Córdova
fonte
Essas são todas muito verdadeiras as coisas, e na verdade isso vai ser a substituição de um "não-processo" e planilha, mas não vejo como isso é uma resposta à minha pergunta. Você pode esclarecer por favor?
RubberDuck
1
@RubberDuck Adicionei um esclarecimento ao final da minha resposta.
Tulains Córdova 03/12/2014
11

Eu diria o Database First, já que tenho muita experiência em projetos grandes e você realmente precisa de um modelo de dados sólido se tiver muitos desenvolvedores trabalhando em paralelo.

Mas então pensei um pouco mais e percebi que o que estávamos realmente fazendo nos grandes projetos mais bem-sucedidos eram os "requisitos primeiro".

Um bom conjunto de requisitos de negócios bem especificado leva a um bom conjunto de requisitos funcionais. Se você tiver um bom conjunto de requisitos funcionais, as especificações do modelo e do módulo de dados serão ajustadas sem muito esforço.

James Anderson
fonte
É exatamente assim que eu normalmente trabalho. Requisitos primeiro , sim. Como eu gostaria de poder arrastar alguns requisitos sólidos de alguém agora.
precisa
Requisitos primeiro, embora você não deva esperar até que os requisitos sejam concluídos (eles nunca são). Comece assim que tiver o suficiente para ter uma idéia de quais são os objetivos do aplicativo e obtenha mais quando precisar deles.
sleske
@sleske - Um bom analista deve ter uma ideia das partes mais "dinâmicas" (ou seja, vagas e mutáveis) dos requisitos e criar alguma flexibilidade no design para lidar facilmente com os caprichos dos usuários.
James Anderson
1
@ JamesAnderson: Na verdade, sou um grande fã dos princípios de desenvolvimento ágil, onde você normalmente projeta apenas o que precisa agora , a menos que saiba que não pode mudar o design posteriormente (raramente é o caso). Mas eu estou começando a ficar fora de tópico ...
sleske 3/04/14
8

Como isso parece tão fluido / não especificado, eu faria a interface gráfica do usuário primeiro - parece o que você precisa para obter respostas, suporte, tempo e feedback das partes interessadas, certo? Eles não se importam com suas tabelas normalizadas brilhantes, restrições de chaves estrangeiras e exclusões em cascata. Mas uma interface gráfica legal com muitas cores brilhantes - bem, isso é de primeira!

Para o "banco de dados" de back-end inicial, use algo extremamente simples, talvez apenas chaves / valores armazenados em um arquivo. Não estou familiarizado com o MS Access, portanto, não sei qual seria o back-end "mais leve". (uma mesa de barrar?) O que for rápido e sujo, planeje jogá-la fora.

Se puder, use uma aparência engraçada na GUI para deixar claro que é um protótipo. Se tudo mais falhar, use cartões de índice.

Agora, talvez suas partes interessadas sejam especialistas em DB - esse tem sido o meu caso algumas vezes! - nesse caso, faça alguns designs de banco de dados.

user949300
fonte
3
+1 para nem "codificar primeiro" nem "primeiro banco de dados", mas "primeiro protótipo de gui não funcional" (também conhecido como "prototipagem rápida"), porque, na ausência de requisitos, o protótipo de GUI ajuda a esclarecer os requisitos com usuários finais.
K3b
1
É verdade, mas também os faz acreditar que o aplicativo é tão bom quanto feito. Eu já havia sido queimado dessa maneira antes e agora exijo que
atinjam
@ Makaw sim, infelizmente isso é um perigo. Uma opção (pelo menos em Java) é usar uma aparência estranha para deixar claro que esse é um protótipo.
user949300
Se você não sabe para onde está indo, qualquer código o levará até lá.
-1

Como os requisitos não são claros, é possível começar com um modelo de dados muito rudimentar com os principais elementos que você saberá que precisa, talvez apenas tabelas e PKs básicas para iniciar. O restante dos dados, serialize em binário ou XML e armazene o BLOB no banco de dados para começar. Isso deve permitir o desenvolvimento da interface do usuário e da camada de negócios (camada intermediária) sem um modelo totalmente relacional, mas você ainda terá persistência para salvar e recuperar, além de consultas simples de chave, conforme necessário.

Como exemplo, talvez você tenha uma Pessoa, então você tem um PK de ID da Pessoa. O restante dos atributos não é conhecido; portanto, comece com uma tabela Person com um PK Person Id e outra coluna que armazenará o Blob, todos os dados da pessoa.

Depois que os requisitos se solidificarem, pegue seus Blobs e extraia todas as tabelas e colunas necessárias e torne o modelo relacional. É apenas uma questão de alterar a persistência de um BLOB para relacional na camada de acesso a dados. Mas tudo o mais, as regras de negócios, a interface do usuário etc. ainda funcionarão. Observe que isso adiciona algum tempo ao projeto, mas permite flexibilidade completa para adicionar e descartar itens conforme necessário, sem alterar o modelo relacional até que as coisas fiquem mais firmes

A pesquisa pode demorar, pois você não pode consultar um BLOB. Assim, como o modelo se estabiliza, comece a armazenar os dados que precisam ser pesquisados ​​em colunas relacionais.

Basicamente, você começa com um modelo tabular e passa para um modelo relacional à medida que o projeto avança.

Ou, reforce os requisitos antes de qualquer trabalho iniciado, para que um modelo relacional possa ser desenvolvido inicialmente.

Jon Raynor
fonte
Assim está a loucura. Nunca persista os dados até estar pronto para persistir os dados. A normalização dos dados após o fato é um pesadelo.
precisa
1
Há uma diferença entre persistência e normalização. A pergunta que só você pode responder é: preciso persistir apenas ou persistir e normalizar. Um modelo de dados é um modelo, se não houver requisitos, é difícil modelar algo relacionalmente.
Jon Raynor
-2

Em geral, acho que o código vem depois dos dados porque o código vai manipular os dados.

Se os requisitos não estiverem claros, você poderá criar um modelo de dados de sua interpretação dos requisitos. Talvez o melhor seja anotar alguns requisitos e enviá-los ao seu empregador, para que eles tenham algo para resolver. Ou crie uma GUI primeiro, depende do tipo de empregador que funciona melhor :)

Kein IhpleD
fonte
3
este não parece oferecer nada substancial sobre os pontos feitos e explicado na prévia 5 respostas
mosquito
Meu ponto é seguir abordagem dependendo do tipo de cliente
Kein IhpleD