Por que muitos projetos ignoram a normalização no RDBMS?


23

Pude ver muitos projetos em que a normalização não era a primeira consideração na fase de tomada de decisão.

Em muitos casos, esses projetos incluíam mais de 30 colunas e a abordagem principal era "colocar tudo no mesmo lugar"

De acordo com o que eu lembro, a normalização é uma das primeiras e mais importantes coisas; então, por que às vezes é tão fácil?

Editar:

É verdade que bons arquitetos e especialistas escolhem um design desnormalizado, enquanto desenvolvedores não experientes escolhem o oposto? Quais são os argumentos contra iniciar seu design com a normalização em mente?


7
porque bancos de dados normalizados precisa de um monte de junta no mesmo os mais consultas triviais
aberração catraca

1
essas associações ainda terá de acontecer mesmo escondido por pontos de vista
catraca aberração

29
Muitos programadores não sabem o básico do modelo relacional.
precisa saber é o seguinte

10
"Normalize até doer, desnormalize até que funcione". codinghorror.com/blog/2008/07/… tem boas respostas.
Matthew Steeples

3
Eles o ignoram porque não precisam responder a DBAs, analistas de BI ou auditores de segurança.
Aaronaught

Respostas:


19

O que é interessante sobre este tópico de perguntas e respostas é que, na verdade, existem 3 perguntas. Todo mundo respondeu uma pergunta diferente e quase ninguém respondeu à primeira:

  1. Por que alguns bancos de dados não são normalizados?
  2. Por que / quando um banco de dados normalizado deve ser desnormalizado ?
  3. Em que situações é prejudicial ou desnecessário normalizar em primeiro lugar?

Os leitores alertas alertam que essas são perguntas muito diferentes, e tentarei responder cada uma separadamente, evitando muitos detalhes. Por "demais", quero dizer que não creio que este seja o contexto apropriado para levar a cabo um extenso debate sobre os méritos de vários argumentos a favor ou contra a normalização; Vou simplesmente explicar quais são esses argumentos, talvez listar algumas advertências e salvar a filosofia para perguntas mais específicas, se elas surgirem.

Além disso, nesta resposta, estou assumindo que "normalização" implica "BCNF, 3NF ou pelo menos 2NF" , pois esse é o nível de normalização que os designers geralmente pretendem alcançar. É mais raro ver designs de 4NF ou 5NF; embora certamente não sejam objetivos impossíveis, eles se preocupam mais com a semântica dos relacionamentos do que apenas com sua representação , o que requer muito mais conhecimento sobre o domínio.

Então, para frente e para cima:

1. Por que alguns bancos de dados não são normalizados?

A resposta para isso pode ser "porque eles não deveriam ser", mas fazer essa suposição logo de cara é um trabalho de detetive bastante irritado. Não teríamos muito progresso como sociedade se sempre operássemos com a suposição de que o que quer que seja, deveria ser.

Os motivos reais pelos quais os bancos de dados não são normalizados são mais complicados. Aqui estão os 5 principais que eu já me deparei:

  • Os desenvolvedores que o criaram não sabiam ou não entendiam como normalizar. Uma forte evidência disso vem na forma de muitas outras opções ruins de design, como usar colunas varchar para tudo ou ter uma bagunça espaguete de nomes de tabelas e colunas sem sentido . E garanto que vi bancos de dados "reais" tão ruins quanto os dos artigos do TDWTF.

  • Os desenvolvedores que o criaram não se importavam ou eram ativamente contra a normalização em princípio . Note, aqui não estou falando de casos em que uma decisão deliberada foi tomada para não normalizar com base em análise contextual, mas equipes ou empresas em que a normalização é mais ou menos compreendida, mas simplesmente ignorada ou evitada por hábito. Mais uma vez, surpreendentemente comum.

  • O software é / foi feito como um projeto Brownfield . Muitos puristas ignoram esse negócio perfeitamente legítimo , e não o motivo técnico para não normalizar. Às vezes, na verdade, você não consegue projetar um novo banco de dados do zero, precisa seguir um esquema herdado existente, e tentar normalizar nesse ponto envolveria muita dor. O 3NF não foi inventado até 1971, e alguns sistemas - especialmente sistemas financeiros / contábeis - têm suas raízes ainda mais longe do que isso!

  • O banco de dados foi originalmente normalizado , mas um acúmulo de pequenas alterações por um longo período de tempo e / ou uma equipe amplamente distribuída introduziu formas sutis de duplicação e outras violações de qualquer forma normal que estivesse originalmente em vigor. Em outras palavras, a perda da normalização foi acidental e pouco tempo foi gasto na refatoração.

  • Foi tomada uma decisão comercial deliberada de não gastar tempo com análise de negócios ou design de banco de dados e apenas "concluí-lo". Isso geralmente é uma economia falsa e acaba se tornando uma forma crescente de dívida técnica , mas às vezes é uma decisão racional, pelo menos com base em informações conhecidas na época - por exemplo, o banco de dados pode ter sido concebido como um protótipo, mas acabou sendo sendo promovido ao uso da produção devido a restrições de tempo ou mudanças no ambiente de negócios.

2. Por que / quando um banco de dados normalizado deve ser desnormalizado?

Essa discussão geralmente surge quando um banco de dados é normalizado para começar. O desempenho é ruim ou há muita duplicação nas consultas (junções), e a equipe sente, com ou sem razão, que foi o mais longe possível com o design atual. É importante observar que a normalização melhora o desempenho na maioria das vezes, e existem várias opções para eliminar junções em excesso quando a normalização parece estar funcionando contra você, muitas das quais são menos invasivas e arriscadas do que simplesmente mudar para um modelo desnormalizado:

  • Crie visualizações indexadas que encapsulem as áreas problemáticas mais comuns. DBMSes modernos são capazes de torná-los inseríveis ou atualizáveis ​​(por exemplo, INSTEAD OFgatilhos do SQL Server ). Isso tem um pequeno custo para as instruções DML nas tabelas / índices subjacentes, mas geralmente é a primeira opção que você deve tentar, porque é quase impossível estragar tudo e custa quase nada para manter. Obviamente, nem todas as consultas podem ser transformadas em uma exibição indexada - as consultas agregadas são as mais problemáticas. O que nos leva ao próximo item ...

  • Crie tabelas agregadas desnormalizadas que são atualizadas automaticamente por gatilhos. Essas tabelas existem além das tabelas normalizadas e formam um tipo de modelo CQRS . Outro modelo do CQRS, mais popular atualmente, é usar pub / sub para atualizar os modelos de consulta, o que oferece o benefício da assincronia, embora isso possa não ser adequado em casos muito raros em que os dados não possam ficar obsoletos.

  • Às vezes, as exibições indexadas não são possíveis, as taxas de transação e os volumes de dados são altos demais para admitir acionadores com desempenho aceitável, e as consultas sempre devem retornar dados em tempo real. Essas situações são raras - eu arriscaria adivinhar que elas podem se aplicar a coisas como comércio de alta frequência ou bancos de dados de aplicação da lei / inteligência - mas elas podem existir. Nesses casos, você realmente não tem opção a não ser desnormalizar as tabelas originais.

3. Em que situações é prejudicial ou desnecessário normalizar em primeiro lugar?

De fato, existem vários bons exemplos aqui:

  • Se o banco de dados estiver sendo usado apenas para relatórios / análises. Normalmente, isso implica que há um banco de dados normalizado adicional sendo usado para OLTP, que é periodicamente sincronizado com o banco de dados de análise por meio de ETL ou sistema de mensagens.

  • Ao impor um modelo normalizado, é necessária uma análise desnecessariamente complexa dos dados recebidos. Um exemplo disso é que pode ser um sistema que precisa armazenar números de telefone coletados de vários sistemas ou bancos de dados externos. Você pode desnormalizar o código de chamada e o código de área, mas é necessário considerar todos os diferentes formatos possíveis, números de telefone inválidos, números pessoais (1-800-GET-STUFF), sem mencionar diferentes localidades. Geralmente, é mais problemático do que vale a pena, e os números de telefone geralmente são empurrados para um único campo, a menos que você tenha uma necessidade comercial específica do código de área por conta própria.

  • Quando o banco de dados relacional está principalmente lá para fornecer suporte transacional para um banco de dados não relacional adicional. Por exemplo, você pode estar usando o banco de dados relacional como uma fila de mensagens ou para rastrear o status de uma transação ou saga, quando os dados primários estiverem sendo armazenados no Redis ou MongoDB ou o que seja. Em outras palavras, os dados são "dados de controle". Normalmente, não há sentido em normalizar dados que não são realmente dados comerciais .

  • Arquiteturas orientadas a serviços que compartilham um banco de dados físico. Este é um pouco de um estranho, mas em um verdadeiro SOA, você vai ocasionalmente precisa ter dados fisicamente duplicados porque os serviços não estão autorizados a diretamente consulta de dados de cada um. Se eles acontecem estar compartilhando o mesmo banco de dados físico, os dados vão aparecer para não ser normalizada - mas geralmente, os dados de propriedade de cada serviço individual está ainda normalizado menos um dos outros fatores atenuantes está no lugar. Por exemplo, um serviço de cobrança pode ser o proprietário da entidade de cobrança, mas o serviço de contabilidade precisa receber e armazenar a data e o valor da cobrança para incluí-la na receita daquele ano.

Tenho certeza de que há mais motivos que eu não listei; o que estou dizendo, em essência, é que eles são bem específicos e serão bastante óbvios quando surgirem na prática. Os bancos de dados OLAP devem usar esquemas em estrela, os SOAs devem ter alguma duplicação etc. Se você estiver trabalhando com um modelo de arquitetura conhecido que simplesmente não funciona com a normalização, não será normalizado; de um modo geral, o modelo de arquitetura tem precedência sobre o modelo de dados.

E para responder à última pergunta:

É verdade que bons arquitetos e especialistas escolhem um design desnormalizado, enquanto desenvolvedores não experientes escolhem o oposto? Quais são os argumentos contra iniciar seu design com a normalização em mente?

Não, isso é completo e absoluto BS É também BS que os especialistas sempre escolhem um design normalizado . Os especialistas não seguem apenas um mantra. Eles pesquisam, analisam, discutem, esclarecem e repetem, e então escolhem qualquer abordagem que faça mais sentido para sua situação específica.

O banco de dados 3NF ou BCNF geralmente é um bom ponto de partida para a análise, porque foi testado e comprovado com sucesso em dezenas de milhares de projetos em todo o mundo, mas também o C. também não significa que usamos automaticamente o C em todos os novo projeto. Situações do mundo real podem exigir algumas modificações no modelo ou o uso de um modelo completamente diferente. Você não sabe até que você esteja em tal situação.


1
Você deve copiar e colar isso em um artigo de blog ... este é o GOLD.
Marcel Popescu

15

A suposição embutida na pergunta e em algumas das respostas é que normalização é sinônimo de bom design de banco de dados. Na verdade, isso geralmente não é o caso. A normalização é uma maneira de atingir um conjunto específico de metas de design e um requisito, se você depende muito do banco de dados para impor "regras de negócios" sobre os relacionamentos entre elementos de dados.

A normalização oferece alguns benefícios importantes:

  1. Minimiza a quantidade de dados redundantes.
  2. Maximiza a extensão em que os mecanismos de integridade integrados do banco de dados (restrições de chave estrangeira, restrições de exclusividade) podem ser aproveitados para garantir a integridade dos dados.
  3. Reduz o número de colunas por linha, aumentando a eficiência da E / S em alguns casos. Linhas largas levam mais tempo para serem recuperadas.

Dito isto, há muitas razões válidas para desnormalizar:

  1. O desempenho, principalmente para análises, pode ser prejudicado pela normalização. Para análise em bancos de dados relacionais, os modelos dimensionais desnormalizados são a abordagem padrão.
  2. O benefício de impor a integridade dos dados dentro do banco de dados está começando a diminuir. À medida que cada vez mais o desenvolvimento se concentra na camada intermediária orientada a objetos, que geralmente impõe regras de negócios, a dependência de restrições relacionais no banco de dados é menos importante.
  3. Como outros já mencionaram, a normalização complicará as consultas necessárias para recuperar dados relevantes.

Não está claro que a normalização seja um sinal de bom design. Em alguns casos, a normalização é um artefato de uma época em que o espaço de armazenamento era escasso e em que grande parte da responsabilidade pela codificação de regras de negócios residia no banco de dados (pense em aplicativos cliente-servidor de duas camadas com a maioria, senão toda a lógica de negócios em procedimentos armazenados). Pode ser que muitos projetos se desviem da normalização com base em boas decisões de arquitetura, em vez de uma compreensão fraca dos princípios de design do banco de dados.

O artigo de Jeff Atwood mencionado nos comentários acima fornece uma boa discussão detalhada - "Talvez a normalização não seja normal" .


7
Oi Yosi, eu entendo o seu ponto. A normalização é fundamental para realmente entender a teoria dos bancos de dados relacionais e tem aplicação real na prática, portanto, não é de surpreender que seja um grande tópico nos cursos. Bons engenheiros devem entender e entender quando deve ser aplicado. O que parece não ser coberto no trabalho do curso é que a desnormalização seletiva pode render muitos benefícios e alguns problemas realmente não se prestam a modelos normalizados.
DemetriKots

1
E a consistência dos dados? Por exemplo, se você tiver o nome da loja em todos os detalhes das vendas, poderá potencialmente ter diferentes descrições contraditórias, enquanto que se os dados forem normalizados, o nome da loja aparecerá apenas um (na tabela da loja) e não haverá lugar para inconsistência.
Tulains Córdova

1
Concordo. Eu acho que a normalização é usada às vezes pelos DBAs que aprenderam que esse é o melhor design. Sempre sugeri que os DBAs podem normalizar as tabelas no ETL tudo o que quiserem, mas quando se trata das tabelas referenciadas pela interface do usuário, preciso de tabelas fáceis de consultar sem junções excessivas. Encontrei tabelas que estavam super normalizadas e mal conseguiam solucionar problemas do usuário sem gastar HOURs na solução de problemas.
L_7337 19:13

1
Por outro lado, a análise é insanamente difícil se você não conseguir iniciar a partir de um modelo normalizado. Eu apenas tive que passar por esse exercício, e foi um inferno. Os desenvolvedores de aplicativos nunca devem assumir que um esquema desnormalizado será adequado para as necessidades de análise. E quanto ao ponto 3 contra a normalização, é um problema que é quase trivialmente resolvido por visualizações materializadas / indexadas.
Aaronaught

1
E o número 2 parece razoável, mas exige muita credulidade na prática - não me lembro de ter visto uma única instância em meus 10 anos ou mais em que as restrições foram realmente aplicadas pelo aplicativo. Mais frequentemente, os desenvolvedores equiparam incorretamente as regras de negócios à integridade dos dados ou usam o fato de que as ORMs teoricamente podem impor restrições relacionais como uma desculpa para não fazer isso em lugar algum. Talvez eu esteja apenas sendo cínico, mas toda a minha experiência profissional me ensinou que declarações como "o aplicativo reforçará a integridade dos dados" são enormes sinais de alerta.
Aaronaught 26/10/2013

11
  1. Muitos desenvolvedores não sabem ou se preocupam com normalização, modelagem de dados ou banco de dados.
  2. Para alguns trabalhos, isso realmente não é importante.
  3. Às vezes, há uma boa razão para des-normalizar, por exemplo, para fazer com que uma carga de trabalho difícil em particular tenha um bom desempenho.
  4. Recentemente, os conceitos de Banco de Dados Relacional estão menos na moda do que nos anos 1990 e 2000. Os desenvolvedores tendem a ser influenciados pela moda, mesmo que afirmem ser muito racionais. Não faz sentido discutir sobre o gosto.

A normalização também é, historicamente, um território para argumentos quase religiosos, por isso hesito em dizer muito mais.


Eu acrescentaria que, às vezes, o relacional não é realmente o design correto para um banco de dados; por exemplo, um diretório LDAP é hierárquico, alguns outros tipos podem ser melhor atendidos por um design plano.
Maximus Minimus

1
Quanto ao ponto 4, eu diria que os bancos de dados relacionais estão menos na moda e estão começando a ser trocados por variedades nosql, e isso é realmente uma grande coisa a maior parte do tempo. Mas não vejo muitos movedores e agitadores reunindo modelos de dados não relacionais usando um RDBMS. Isso é estúpido.
Aaronaught

@joshp - Obrigado, bom resumo. o ponto 3 é o que mais me interessa pessoalmente. Por que outros fatores "superam" a necessidade de normalização.
Yosi Dahari

@JimmyShelter Concordo. Moda à parte, relacional nem sempre é a melhor escolha.
joshp

4
@ Yosi - A razão pela qual alguns fatores podem superar a normalização é que a normalização é uma técnica para evitar problemas comuns de consistência de dados quando os dados estão sendo inseridos, atualizados e excluídos. Se os dados forem gravados uma vez e depois lidos somente depois, os C, U e D do CRUD não importam mais. Nesse caso, os benefícios da normalização são basicamente sem sentido, portanto outras pressões concorrentes podem ter precedência, como desempenho de leitura ou simplicidade de consulta.
Joel Brown

9

Em grandes projetos, especialmente aqueles em mainframes, esse não é o caso. De fato, se você pesquisar sites de emprego, verá várias posições para modeladores de dados. Além disso, ter muitas colunas em uma única tabela não contraria a normalização. No entanto, sua observação é válida para alguns projetos.

O design do banco de dados é uma das habilidades necessárias para criar sistemas de qualidade. Dito isto, alguns desenvolvedores não sabem o suficiente sobre o design de banco de dados e ainda são designados para a tarefa de modelagem de dados e design de banco de dados. Alguns projetos até ignoram a modelagem de dados. O foco em muitos projetos está principalmente na codificação e no design de front-end.

Outro fator para o design inadequado do banco de dados é o fato de que Normalização não é um tópico trivial, especialmente quando se trata da 4ª, 5ª, etc. A maioria dos livros que eu vi não conseguia explicar claramente claramente essas formas. Geralmente existem exemplos ruins e muita teoria. Isso torna o tópico menos popular do que deveria.

É difícil encontrar erros no design do banco de dados, a menos que você os procure ou os encontre durante o teste. Não ter um padrão para a qualidade do design do banco de dados permite que os erros aconteçam com maior probabilidade.

Acrescente a isso o fato de que alguns projetos não seguem uma metodologia rigorosa de desenvolvimento (que promove o design do banco de dados), como resultado, as responsabilidades se misturam e as tarefas se perdem entre o analista de negócios, os desenvolvedores e os DBAs. Os desenvolvedores falam em OO e UML, onde os DBAs falam em DD e alguns em ERDs e provavelmente muitos não recebem UML ou OO. Em resumo, a falta de conhecimento, a falta de bons recursos claros, a falta de linguagem unificada para descrever dados e a falta de metodologia são as principais culpadas.


Você pode sugerir documentos / artigos de qualidade de design de banco de dados (não apenas esquema, mas também procedimentos)?
Tilak 29/09

"ter muitas colunas em uma única tabela não contraria a normalização" -Claro. Minha intenção era #entailments. Na questão mencionei #columns apenas para simplificar, a minha suposição era de que o leitor vai entender a correlação e por isso que eu quis dizer
Yosi Dahari

@ Tilak, não tenho certeza se existe uma referência específica para obter as melhores diretrizes, mas você pode coletar sua lista na literatura sobre modelagem de dados e design de banco de dados. Desculpe se isso não responde à sua pergunta. Eu acho que esse poderia ser um bom assunto para um livro.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.