Como posso argumentar de forma convincente contra a duplicação de colunas do banco de dados?

47

Comecei a trabalhar em uma nova organização e um dos padrões que tenho visto no banco de dados é a duplicação de campos para facilitar a escrita de consultas para os analistas de negócios. Estamos usando o Django e seu ORM.

Em um caso, mantemos um objeto MedicalRecordNumber com uma string exclusiva que identifica um paciente em um determinado contexto. Temos objetos de registro que rastreiam pacientes e associaram MedicalRecordNumbers , mas, em vez de usar um relacionamento de chave estrangeira, eles duplicam a string para evitar a gravação de uma junção ( não por motivos de desempenho). Esse padrão é comum em todo o banco de dados.

Para mim, a importância de um modelo de dados estar limpo é apenas para que eu possa pensar bem. A complexidade desnecessária é um desperdício do meu tempo limitado de processamento cognitivo. É um problema sistemático. Não se sentir à vontade para escrever junções é uma questão de habilidades retificáveis. Eu não quero necessariamente advogar voltar e alterar o esquema, mas adoraria poder articular de forma convincente os problemas com esse tipo de duplicação.

canisrufus
fonte
2
O que significa "não se sentir confortável ao escrever associações"? Como eles explicam isso?
Script #
9
Essas pessoas trabalham para você? Você é o supervisor deles? A maioria das suas justificativas pode ser encontrada aqui: en.wikipedia.org/wiki/Database_normalization . Sim, eles precisam melhorar o uso de junções.
Robert Harvey
1
Você consultou a literatura sobre por que a normalização é desejável?
21415 Nathan Tuggy
17
Adicionar visualizações que fazem a junção internamente não tornaria as consultas de gravação tão fáceis? Você pode sugeri-los como uma alternativa.
código é o seguinte
1
Você comunicou isso (educadamente) com seus colegas e idosos? Quais são suas justificativas, que considerações eles estão fazendo? Há muitas razões possíveis para que essa seja uma boa ideia (mesmo que você diga "desempenho não é o motivo", que evidência você tem para apoiar isso?). Antes de acusá-los de serem preguiçosos e / ou rígidos, você já considerou (e perguntou) as razões que eles têm para ter o design do jeito que é? Talvez haja muito mais leituras do que gravações (DB pesado da análise)? Alterar rastreamento? Data histórica? Pergunte a todos - alguém pode saber o verdadeiro motivo.
Luaan

Respostas:

128

Seu banco de dados operacional deve ser altamente normalizado, para reduzir anomalias .

Seu banco de dados analítico (armazém) deve ser altamente desnormalizado, para facilitar a análise.

Se você não possui um banco de dados analítico separado, faça algumas visualizações [materializadas] altamente desnormalizadas.

Se você disser aos analistas / gerentes de negócios seniores que fazem muitas associações para uma análise simples, bem, você poderá ser demitido.

O Agile Data Warehouse Design é um bom livro

Veja minhas dicas rápidas e sujas sobre data warehouse aqui

Neil McGuigan
fonte
9
Este é o caminho certo a seguir.
Nit
6
+1 É exatamente para isso que as Views são destinadas: permitir uma exibição desnormalizada em um banco de dados normalizado.
Nzall 12/04
4
Absolutamente correto, mas acho que "reduzir anomalias" deve ser enfatizado mais, já que essa é a resposta primária à pergunta. A anomalia mais comum (apenas?) Que você verá com duplicação / desnormalização de dados é que as colunas serão preenchidas de alguma forma com dados contraditórios ao mesmo tempo, deixando você sem maneira de saber o que os dados reais devem ser e não maneira de determinar o que deu errado. O último pode ser mitigado com um rastreamento maciço de alterações, mas isso não será barato ou rápido para encontrar o problema. Mais rentável para evitar o problema completamente.
Jpmc26
2
Outro ângulo a considerar é que, mesmo assumindo que os desenvolvedores sejam capazes de manter os dados corretos (duvidosos), torna-se um grande desperdício de recursos para garantir que todos os campos duplicados sejam atualizados quando necessário para manter a consistência.
Nate CK
1
@ Panzercrisis A única maneira de uma transação ser "implícita" é se você tiver uma confirmação automática em execução no final da sua consulta. Normalmente, esse não deve ser o caso de um banco de dados de produção. Em um aplicativo, as transações devem ser iniciadas automaticamente e um commit deve ser emitido separadamente da consulta. Esse é um pequeno investimento inicial no aplicativo, mas simplifica as alterações de código que envolvem a adição de chamadas ao banco de dados e reduz o quanto um desenvolvedor precisa pensar (melhora a velocidade do desenvolvedor, reduz os erros do desenvolvedor). Esse tipo de design também se encaixa bem em coisas como pool de conexão.
precisa saber é o seguinte
57

Entendo por que alguém quer evitar escrever uma associação para cada seleção.

Mas você pode criar uma visualização uma vez com a associação e usá-la em vez de sua tabela não normalizada.

Assim, você combina a vantagem da normalização com a conveniência de uma seleção fácil.

knut
fonte
12
As visualizações são seus amigos. Use-os liberalmente. E para o desempenho, você pode até usar as visualizações materializadas se o seu RDBMS as suportar.
VH-NZZ
13

As respostas que já foram votadas abrangem praticamente o "como evitar a duplicação" (usando visualizações), mas não o porquê. Eles basicamente mostram que a duplicação de colunas é a solução errada para o problema de facilitar a gravação de consultas. Mas a pergunta "por que não duplicar qualquer coluna aleatória apenas para o inferno?" Ainda está de pé.

A resposta é "Por causa da lei de Murphy". A lei de Murphy afirma que:

Se algo pode dar errado, vai dar.

Nesse caso, o conteúdo de cada campo de linha de uma coluna duplicada deve ser idêntico ao conteúdo de cada campo de linha correspondente da coluna original. O que pode dar errado é que o conteúdo de alguns campos de linha pode diferir dos originais, causando estragos. Você pode pensar que tomou todas as precauções possíveis para garantir que elas não sejam diferentes, mas a lei de Murphy declara que, uma vez que podem ser diferentes, elas serão diferentes. E haverá destruição .

Como um exemplo de como isso pode acontecer, basta considerar o fato de que as colunas duplicadas não são preenchidas por mágica; alguém deve realmente escrever um código que armazene valores neles sempre que as linhas são criadas na tabela original e alguém deve escrever um código que continue atualizando-os sempre que os originais forem modificados. Deixando de lado o fato de que isso está adicionando uma carga indevida ao código que insere dados no banco de dados (e que, por definição, é muito mais crucial do que qualquer código que simplesmente consulta o banco de dados), alguém em algum lugar, sob certas circunstâncias, pode esquecer para realizar essa duplicação. Então, os valores serão diferentes. Ou eles podem se lembrar de realizar a duplicação, mas não dentro de uma transação, de modo que, sob certas condições raras de falha, seja omitida. Mas eu realmente não precisava perder meu tempo escrevendo esses exemplos,se pode dar errado, vai dar.

Mike Nakis
fonte
12

Pensar nisso em termos de troca, em vez de bom / ruim, será mais produtivo. Eles estão trocando vantagens da normalização (especialmente consistência) por vantagens na usabilidade da consulta.

Em um extremo, o banco de dados se tornaria inútil se os dados ficassem severamente inconsistentes. No outro extremo, o banco de dados seria inútil se for muito difícil para as pessoas que precisam consultá-lo todos os dias para obter resultados com os quais possam contar.

O que você pode fazer para reduzir os riscos e os custos?

  • Crie uma ferramenta de verificação de consistência e execute-a regularmente.
  • Encaminhe o acesso de gravação por meio de software que atualize os dados replicados de forma consistente.
  • Adicione visualizações ou construa ferramentas de consulta que fazem as junções automaticamente, para que os empresários possam pensar em termos de informações, e não nos dados internos do banco de dados.
Jerry101
fonte
6

Eu acho que o argumento mais forte para normalização de dados para analistas de negócios é que ele promove a integridade dos dados. Se seus dados principais estiverem armazenados em apenas um local (uma coluna, em uma tabela), é muito menos provável que os dados sejam corrompidos por atualizações incorretas. Eu acho que eles provavelmente se importariam com a importância da integridade dos dados, portanto essa pode ser uma boa maneira de convencê-los a atualizar suas maneiras de interagir com o banco de dados.

Um método um pouco mais difícil de consultar provavelmente será preferível a uma potencial corrupção de dados.

Oleksi
fonte
6
Seu pessoal argumentará que eles são bons o suficiente para garantir que todos os dados estejam sendo atualizados corretamente (uma premissa que eu discuto, se não se sentir confortável com as junções). Talvez um argumento melhor seja que você perca a maioria dos benefícios do ACID que os RDBMS fornecem, se você evitar a normalização.
21715 Robert
4
Provavelmente, mas é tudo uma questão de risco. Eles estão dispostos a aceitar o risco de corromper o banco de dados porque facilita a consulta?
Oleksi
1
No papel de advogado do diabo aqui, um contra-argumento óbvio seria que, se alguém vai estragar uma atualização e corromper os dados de qualquer maneira, isso é um problema com ou sem normalização - e, pelo menos, com alguma redundância no banco de dados, é mais provável alguém notará a corrupção e poderá corrigi-la mais tarde. (Claro, ad hoc desnormalização não é o esquema de detecção de erros mais confiável, mas o princípio de verificação de erros através de redundância é som: Isso é como contabilidade de dupla entrada obras.)
Ilmari Karonen
Ou, para colocar em outros termos, há mais na integridade dos dados do que apenas na integridade relacional. Com um banco de dados totalmente normalizado, você ainda pode manter a integridade relacional perfeita, mesmo que alguém atrapalhe uma atualização, mas isso não torna os dados atualizados incorretamente menos lixo.
Ilmari Karonen
0

Para adicionar ao que os outros caras sugeriram acima. Este é um problema de governança de dados. Você precisa trabalhar com as partes interessadas relevantes: arquitetos e administradores de dados para desenvolver princípios, políticas e convenções de nomenclatura.

Seja paciente e trabalhe metodicamente. A mudança não vai acontecer durante a noite.

hlosukwakha
fonte
0

Sair.

Honestamente, você pode passar meses discutindo sobre normalização, consistência e combatendo bugs malucos causados ​​por pura preguiça e depois sair.

Ou você pode economizar tempo, frustração e sair agora.

Bons programadores são pessoas muito preguiçosas. Eles entendem as necessidades dos clientes e da gerência. Mas o mais importante é que eles entendem que resolver bem os problemas, usar soluções bem projetadas e bem implementadas, os poupa pessoalmente GRANDES quantidades de trabalho, esforço e, principalmente, agonia e estresse.

Então você seria muito melhor trabalhando em um lugar que entenda e valorize a boa engenharia.

Boa sorte.


Pensamento Posterior: Talvez o que eles precisem sejam ferramentas de BI / OLAP ... http://en.wikipedia.org/wiki/Online_analytical_processing

AK_
fonte