A normalização do banco de dados está inoperante? [fechadas]


16

Fui educado na velha escola - onde aprendemos a projetar o esquema do banco de dados ANTES da camada de negócios do aplicativo (ou usando o OOAD para todo o resto). Eu fui muito bom em projetar esquemas (IMHO :) e normalizei apenas para remover redundância desnecessária, mas não onde isso afetava a velocidade. Mas principalmente não era.

Com o advento de algumas estruturas ORM como o ActiveRecord do Ruby ou o ActiveJDBC (e algumas outras que não me lembro, mas tenho certeza de que há muitas), parece que elas preferem ter uma chave substituta para todas as tabelas, mesmo que algumas tenham chaves primárias como 'email' - quebrando 2NF diretamente. Ok, eu não entendo muito, mas isso me dá nos nervos (quase) quando alguns desses ORMs (ou programadores) não reconhecem 1-1 ou 1-0 | 1 (ou seja, 1 a 0 ou 1). Eles estipulam que é melhor ter tudo como uma grande mesa, não importa se há uma tonelada de nulls "sistemas de hoje em dia", é o comentário que eu ouvi com mais frequência.

Concordo que as restrições de memória tiveram uma correlação direta com a normalização (também existem outros benefícios :), mas hoje em dia com memória barata e máquinas quad-core, o conceito de normalização de banco de dados é deixado apenas para os textos? Como DBAs você ainda pratica a normalização para 3NF (se não for BCNF :)? Isso importa? O design do "esquema sujo" é bom para os sistemas de produção? Como se deve defender a normalização "se" ainda é relevante.

( Observação: não estou falando dos esquemas em estrela / floco de neve do datawarehouse que têm redundância como parte / necessidade do design, mas sistemas comerciais com um banco de dados de back-end como o StackExchange, por exemplo)

Respostas:


17

Uma razão para a normalização é remover as anomalias de modificação de dados que os
ORMs geralmente não suportam.

Eu tenho muitos exemplos de bancos de dados criados pelo Hibernate que quebram esse princípio:

  • inchado (sequência repetida em centenas de milhões de linhas)
  • sem tabelas de pesquisa (veja acima)
  • sem DRI (restrições, chaves)
  • índices agrupados varchar
  • tabelas de links desnecessárias (por exemplo, impondo 1..0: 1 quando uma coluna FK anulável seria suficiente)

O pior que eu já vi é um banco de dados MySQL de 1 TB que talvez tenha 75-80% a mais por causa desses

Eu também sugeriria que a afirmação "os sistemas atuais podem lidar com isso" é verdadeira para a maioria dos sistemas Mickey Mouse. À medida que você escala, os sistemas atuais não.

No meu exemplo acima, não havia como refatorar ou alterar chaves ou corrigir dados: apenas reclame sobre as taxas de crescimento do banco de dados e a incapacidade de criar um DW significativo sobre ele


13

parece que eles preferem ter uma chave substituta para todas as tabelas, mesmo que algumas tenham chaves primárias como 'email' - quebrando 2NF imediatamente.

Chaves substitutas não quebram 2NF. 2NF diz "Se uma coluna depender apenas de parte de uma chave com vários valores, remova essa coluna para uma tabela separada".

Eles estipulam que é melhor ter tudo como uma grande mesa, independentemente de ter uma tonelada de valores nulos

Ter várias colunas em uma tabela é válida desde que as regras de Normalização sejam seguidas. Não é correto mesclar tabelas sem análise se você deseja colher os benefícios do SQL e da normalização.

Concordo que as restrições de memória tinham uma correlação direta com a normalização. Relation Normal Forms é um conceito matemático e não tem nada a ver com memória.

A normalização existe não apenas para economizar memória ou disco, mas também para adicionar integridade. Afinal, é um conceito matemático independente do hardware.

Exemplo simples: digamos que você mantenha as informações da escola como:

Rec 1: North Ridge High School, Califórnia, EUA

Rec 2: South Toronto Braves High School, Ontário, Canadá

Se você perguntar ao seu sistema onde fica Ontário, poderá descobrir que ele está no Canadá. Poucos dias depois, você exclui a 2ª linha e faz a mesma pergunta ao sistema e não recebe nada. Neste exemplo, não importa quanto espaço em disco, memória ou CPU, você não receberá a resposta.

Esta é uma anomalia que normalizar as relações ajuda a prevenir.

Editar: Alterada a palavra Toronto para Ontário, conforme comentário abaixo.


11
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Paul White Reinstate Monica

12

Quanto mais as coisas mudam, mais elas permanecem iguais. Sempre houve desenvolvedores preguiçosos que cortam custos ou simplesmente não sabem ou querem seguir as melhores práticas. Muitas vezes eles conseguem se safar em aplicações menores.

Costumava colocar estruturas de dados inspiradas em COBOL no RDBMS inicial, ou na bagunça horrível que era o dBase. Agora são ORMs e "Code-First". No final, essas são apenas maneiras de as pessoas tentarem encontrar a bala de prata de obter um sistema operacional sem "perder" tempo pensando muito sobre o que você quer e precisa fazer. Estar com pressa sempre foi um problema e sempre será um problema.

Para aqueles que têm bom senso (e boa sorte) dedicando um tempo para projetar adequadamente, o modelo de dados sempre será o local mais lógico para começar. O que existe no banco de dados são informações sobre as coisas (tangíveis e intangíveis) com as quais sua empresa se importa. O que sua empresa se importa muda muito menos rapidamente do que a forma como sua empresa opera. É por isso que seu banco de dados geralmente é muito mais estável que seu código.

O banco de dados é a base legítima de qualquer sistema, e dedicar um tempo para estabelecer suas bases corretamente irá inevitavelmente beneficiar você a longo prazo. Isso significa que a normalização sempre será uma etapa importante e útil para qualquer aplicativo do tipo OLTP.


9

Concordo que as restrições de memória tinham uma correlação direta com a normalização ...

As restrições de memória ainda são importantes. Quantidade não é problema, velocidade é.

  • As CPUs não estão ficando mais rápidas no momento (estamos recebendo mais cores, não ciclos por segundo)
  • As arquiteturas modernas de CPU tentam superar a limitação de velocidade, fornecendo memória separada para cada processador ( NUMA ).
  • Os tamanhos de cache na matriz não estão crescendo a uma taxa comparável à memória principal.
  • A taxa de transferência de memória não é tão alta quanto a maioria das pessoas espera. O QPI está na região de 25 GB / s.

Parte desse terreno foi abordada em Quando usar TINYINT sobre INT? que você pode achar útil. Eu também sugeriria seguir as palhaçadas do @ThomasKejser ( blog ) da equipe SQLCAT, pois elas tendem a estar na ponta afiada de aumentar o desempenho do banco de dados. A publicação recente sobre O efeito dos caches de CPU e padrões de acesso à memória e a apresentação do SQLBits na modelagem relacional para a escala extrema de DW são bons exemplos.


2

Na minha opinião, ainda é apenas sobre o equilíbrio entre normalizar e des-normalizar . Concordo totalmente que as estruturas ORM são apenas abordagens para fazer as coisas, mas não acho que sejam essas estruturas que estão causando a tendência de des normalização .

ainda é esse debate que você quer eficiência de tempo ou eficiência de espaço. No momento em que a teoria do banco de dados relacional é apresentada, o armazenamento em disco é caro, as pessoas obviamente não querem gastar muito dinheiro com isso, é por isso que naquele tempo os bancos de dados relacionais são os que se mantêm firmes em meio às adversidades

Hoje em dia as coisas são bem diferentes, o armazenamento é muito, muito barato. Então, obviamente, podemos tolerar mais redundância em comparação com os velhos tempos, também é por isso que a abordagem BIG_TABLE apareceu. a fim de buscar mais eficiência de tempo, a eficiência do espaço deve ser sacrificada.

Mas, a abordagem de mesa grande também não é o fim da história, ainda é o equilíbrio entre tempo e espaço, em termos de dados de volume do PB para gerenciar, alguns desenvolvedores também começaram a buscar o equilíbrio de volta à eficiência do espaço, é por isso que são trabalhos feitos para normalizar alguns dados em estruturas do tipo BIG-TABLE.

Em uma palavra, a abordagem de normalização não está morta definitivamente, mas comparada com os velhos tempos, ela é definitivamente ignorada.


0

CJ Date responde à sua pergunta aqui - o vídeo de normalização (preliminar) é gratuito.

http://shop.oreilly.com/product/0636920025900.do

A resposta curta: normalização é a maneira matematicamente correta de fazer as coisas. Se você não normalizar corretamente, seu modelo de dados está simplesmente incorreto.

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.