Prevendo vantagens da desnormalização do banco de dados

8

Sempre fui ensinado a buscar a mais alta forma normal de normalização de banco de dados, e o algoritmo de síntese de Bernstein aprendeu a alcançar 3NF. Tudo está muito bem e é bom normalizar seu banco de dados, sabendo que os campos podem ser modificados, mantendo a consistência.

No entanto, o desempenho pode sofrer. É por isso que estou me perguntando se existe alguma maneira de prever a aceleração / desaceleração ao desnormalizar. Dessa forma, você pode criar sua lista de FDs com 3NF e depois desnormalizar o mínimo possível. Imagino que desnormalizar demais desperdiçaria espaço e tempo, porque, por exemplo, blobs gigantes são duplicados ou porque é mais difícil manter a consistência, porque você precisa atualizar vários campos usando uma transação.

Resumo: Dado um conjunto de 3NF FD e um conjunto de consultas, como prever a aceleração / desaceleração da desnormalização? Link para artigos apreciados também.

Janus Troelsen
fonte
3
Esta é uma pergunta interessante, mas eu me pergunto o quanto a resposta pode ser diferente, dependendo do banco de dados que você está usando, ou seja, PostgreSQL vs. a Oracle vs. MySQL vs. MSSQL ...
FrustratedWithFormsDesigner
2
Esta é uma questão puramente acadêmica ou "mundo real"? se for mais tarde, então a velhice "não escalará até que você falhe" vem à mente.
Darknight
@FrustratedWithFormsDesigner: deve ser um conjunto comum de operações necessárias. Por exemplo, certamente um JOIN em campos não indexados no tempo O (1) é impossível, ou?
Janus Troelsen
4
Qualquer tentativa de prever o desempenho durante o design de um banco de dados é quase certamente uma otimização prematura. O desempenho do banco de dados depende de vários fatores, muitos dos quais você não poderá prever até começar a usar o sistema. Normalize o banco de dados, faça uso adequado da indexação e execute desnormalizações específicas quando puder identificar problemas de desempenho específicos que podem ser resolvidos dessa maneira.
Robert Harvey
1
Boa pergunta. me interessou. Acho que em áreas que normalizamos demais nosso banco de dados, acabamos com algumas visualizações complexas demais que nos ajudam a desnormalizar e, potencialmente, muitos índices.
Gavin Howden

Respostas:

1

Você precisaria conhecer os fluxos de dados entre as tabelas para poder ver o desempenho do modelo de banco de dados. Depois de conseguir, você pode calcular a alteração no desempenho de uma determinada desnormalização (por exemplo, se você decidir duplicar dados)

Algumas estimativas aproximadas podem ser deduzidas por quantos novos índices você precisaria após as etapas de desnormalização. Cada novo índice deve ser atualizado e consultado separadamente, o que resultará em uma ocorrência de desempenho apropriada ao número de novos índices.

Grandes blobs de dados binários devem, em qualquer caso, ser armazenados em uma tabela separada e não copiados. Eles geralmente não são consultados, mas retornados como parte do conjunto de resultados final após uma consulta em algum outro conjunto de tabelas.

solista
fonte
1

Não tenho certeza de que haja alguma pesquisa acadêmica sobre quando a desnormalização pode ajudar (IMHO, há uma grande diferença entre o que é ensinado sobre normalização de banco de dados e como ele funciona na prática).

No entanto, existem vários artigos interessantes e entradas de blog sobre isso _ Jeff Atwood fala sobre normalização em seu blog , e há uma "resposta" a ele com alta escalabilidade.

Ao desnormalizar, sugiro que você preste atenção

  • o número e o tipo de consultas por unidade de tempo; se você usar inserir e / ou atualizar mais do que ler, a desnormalização não ajudaria muito.
  • com que frequência as informações duplicadas serão atualizadas
  • as características do DBMS que você usará
  • quantas vezes a informação é duplicada; se você tiver as mesmas informações nas tabelas 4-5, pode ser mais rápido mantê-las em uma tabela separada do que copiá-las tantas vezes
  • a quantidade esperada de dados mantidos no DB; o que pode funcionar para pequenas quantidades de dados, pode levar a um desastre se o número de registros aumentar. E vice-verso (quero dizer o princípio do KISS e não consertar o que não está quebrado).
superM
fonte
1

Imagino que des normalizar demais desperdiçaria espaço e tempo

O espaço não deve se preocupar com a maioria dos aplicativos OLTP de linha de negócios de tamanho médio. Então deixe espaço de lado. Tempo e pressupor que você quer dizer desempenho da consulta, algo que geralmente pode ser aprimorado e não causa um problema real, a menos que você tenha um design ruim, recursos insuficientes, banco de dados extremamente grande, número muito grande de transações ou todas o de cima. A maioria dos aplicativos que usam os bancos de dados atuais raramente teria um problema de desempenho apenas porque o banco de dados é Normalizado.

os blobs gigantes são duplicados ou são mais difíceis de manter a consistência porque você precisa atualizar vários campos usando uma transação.

A normalização do seu banco de dados garante que você projete:

  1. Não possui dados redundantes.

  2. Não causa a criação de um grande número de enterites de log (por exemplo, com uma tabela de 2 milhões de clientes: UPDATE Customer Set Country = "USA" WHERE Country = "US")

  3. Ser totalmente suportado seja consultas SQL. Este ponto é muito importante.

  4. Dirigirá código de aplicativo limpo.

  5. Forçar um alto grau de consistência dos dados por meio do banco de dados sem sobrecarregar o aplicativo.

  6. Compartilhe regras de negócios definidas no banco de dados por aplicativos diferentes sem codificar o mesmo código em aplicativos diferentes.

Dito isto, a Normalização produz uma estrutura ideal para todas as colunas e tabelas. Isso nem sempre é necessário em seu aplicativo em particular; você poderá determinar, dada sua compreensão do seu domínio e do seu aplicativo, desnormalizar algumas das tabelas / colunas como uma troca de velocidade. No entanto, isso seria uma decisão consciente e não uma supervisão.

Dado um conjunto de 3NF FD e um conjunto de consultas, como prever a aceleração / desaceleração da desnormalização?

Você não pode prever o desempenho com precisão sem testar (o que você pode fazer antes de escrever o código do aplicativo). No entanto, você pode eliminar e detectar fatores que levariam a um desempenho ruim por design. Por exemplo, você pode identificar qual estratégia de índice usar da seguinte maneira (outras técnicas podem existir):

  1. Crie uma matriz de consultas e colunas afetadas por essas consultas.

  2. Encontre as colunas mais usadas.

  3. Considere a criação de índices nessas colunas.

Este é principalmente um trabalho em que o seu DBA pode ajudá-lo. Há mais desempenho do que Normalização. Existem aspectos da distribuição de dados em volumes de disco, divisão vertical de tabela, particionamento, tipos de índice e buffer de índice, para citar alguns. Todas essas técnicas devem ser abordadas nos livros e na documentação do fornecedor nos assuntos "Design do banco de dados" e "Ajuste do desempenho do banco de dados". Toda a discussão acima pressupõe que seu aplicativo é um aplicativo OLTP.

NoChance
fonte
1

Um dos principais motivos para normalizar é que ele otimiza para casos de uso geral, enquanto a desnormalização tende a otimizar o desempenho para casos de uso especializados (com penalidades significativas para outros casos de uso). Esse é um dos motivos pelos quais geralmente as cargas de trabalho OLTP se beneficiam principalmente da normalização (há exceções aqui, mas são raras).

Para prever vantagens, o que você realmente precisa saber é o que exatamente está desnormalizando e para quais fluxos de trabalho. Há também perguntas sobre o tamanho do seu conjunto de dados e quais os impactos do cache provavelmente. Portanto, é provável que a resposta dependa de um número muito grande de coisas, incluindo o tamanho do banco de dados, qual parte provavelmente ainda estará na memória, o planejamento de despesas gerais de consultas complexas etc. Esse é um assunto muito complicado, específico da implementação, e depende muito do banco de dados e do RDBMS. Essas vantagens serão maiores nas cargas de trabalho OLAP e, normalmente, as desvantagens serão maiores nas cargas de trabalho OLTP.

Portanto, não vejo aqui uma única resposta além de assistir aos planos de consulta e considero a possibilidade de visualizações materializadas para dados desnormalizados. Na minha opinião, a melhor abordagem é ter um banco de dados OLTP relativamente normalizado e desnormalizar para fins de relatório, conforme necessário.

Chris Travers
fonte
1

Normalmente, você desnormaliza seu modelo de dados para otimizar o desempenho de um caso de uso específico . Isso geralmente terá um efeito adverso no desempenho de outros casos de uso. por exemplo, a repetição de dados em várias linhas pode acelerar o processamento de consultas, eliminando uma associação, mas o processamento da atualização será mais lento.

Com efeito, o 3NF oferece desempenho ideal para qualquer número de acessos arbitrários ao seu banco de dados, mas, para junções e seleções específicas, pode haver modelos melhores.

Portanto, trate a desnormalização como faria com qualquer outra otimização. ou seja, não faça isso a menos que você tenha um problema de desempenho e verifique se a sua 'correção' não causa mais problemas do que resolve.

James Anderson
fonte