web-dev-qa-db-fra.com

Prédire les avantages de la dénormalisation de la base de données

On m'a toujours appris à rechercher la plus haute forme normale de normalisation de la base de données et nous avons été enseignés Algorithme de synthèse de Bernstein pour atteindre 3NF. Tout cela est très bien et il est agréable de normaliser votre base de données, sachant que les champs peuvent être modifiés tout en conservant la cohérence.

Cependant, la performance peut souffrir. C'est pourquoi je me demande s'il existe un moyen de prédire le spef-up/ralentissement lors de la dénormalisation. De cette façon, vous pouvez construire votre liste de FD avec 3NF, puis dénormaliser le moins possible. J'imagine que la dénormalisation trop de gaspillerait de l'espace et du temps, car par ex. Les blobs géants sont dupliqués, car il est difficile de maintenir la cohérence car vous devez mettre à jour plusieurs champs à l'aide d'une transaction.

Résumé: Compte tenu d'un ensemble FD 3NF et d'un ensemble de requêtes, comment puis-je prédire le spef-up/ralentissement de la dénormalisation? Lien vers des papiers appréciés aussi.

8
Janus Troelsen

L'une des nombreuses principales raisons de normaliser est qu'elle optimise pour les cas d'utilisation générale tandis que la dénormalisation a tendance à optimiser les performances des cas d'utilisation spécialisée (avec des sanctions importantes pour les autres cas d'utilisation). C'est une raison pour laquelle généralement OLTP charge de travail bénéficie principalement de la normalisation (il y a des exceptions ici, mais elles sont rares).

Afin de prédire les avantages, ce que vous devez vraiment savoir, c'est ce que vous vous dénormalisez exactement et pour quels flux de travail. Il existe également des questions sur la taille de votre ensemble de données et sur les impacts de la mise en cache. La réponse est donc susceptible de dépendre d'un très grand nombre de choses, y compris la taille de la base de données, quelle partie est susceptible de toujours être en mémoire, planifiant les frais généraux des requêtes complexes, etc. Il s'agit d'une matière très compliquée et spécifique à la mise en œuvre, et cela dépend beaucoup de votre base de données et de vos SGBDR. Ces avantages seront plus importants dans OLAP Workloads, et généralement les inconvénients seront plus grands dans OLTP Workloads.

Donc, je ne vois pas qu'il y a une seule réponse ici autre que de regarder des plans de requête et envisager la possibilité de vues matérialisées pour des données dénormalisées. À mon avis, la meilleure approche consiste à avoir relativement normalisé OLTP Database et dénormaliser à des fins de déclaration uniquement.

1
Chris Travers

Normalement, vous normaliser votre modèle de données pour optimiser les performances pour n cas d'utilisation particulier. Cela aura généralement un effet défavorable sur la performance des autres cas d'utilisation. par exemple. Les données répétées dans plusieurs lignes peuvent accélérer le traitement de la requête en éliminant une jointure, mais votre traitement de mise à jour sera ralentissement.

En effet, 3NF donne des performances optimales pour n'importe quel nombre d'accès arbitraires à votre base de données, mais, pour des jointures particulières et sélectionnant, il peut y avoir de meilleurs modèles.

Traitez donc la dés-normalisation comme si vous auriez une autre optimisation. Je ne le fais pas à moins d'avoir un problème de performance et assurez-vous que votre "solution" ne provoque pas plus de problèmes que ce qu'il résoue.

1
James Anderson

J'imagine que la dés-normalisation trop de gaspillerait de l'espace et du temps

L'espace ne doit pas s'inquiéter de la première ligne de taille moyenne de business OLTP Applications. Donc, laissez de côté de l'espace. Temps et à la fois, je suppose que vous voulez dire la performance de la requête, c'est quelque chose qui peut généralement être Enrichi et ne provoque pas de véritable problème à moins que vous n'ayez une mauvaise conception, des ressources insuffisantes, une base de données extrêmement importante, un très grand nombre de transactions ou tout ce qui précède. La plupart des applications utilisant les bases de données d'aujourd'hui auraient rarement un problème de performance uniquement parce que la base de données est normalisée. .

les blobs géants sont dupliqués, car il est difficile de maintenir la cohérence car vous devez mettre à jour plusieurs champs à l'aide d'une transaction.

Normaliser votre base de données vous assure que vous concevez Will:

  1. Ne pas avoir de données redondantes.

  2. Ne causez pas un nombre énorme de logement entérite à créer (ex avec une table de 2 millions de clients: Mettre à jour le client Set Country = "USA" où pays = "US")

  3. Être soutenu intégralement être des requêtes SQL. Ce point est très important.

  4. Va conduire le code d'application propre.

  5. Forcez un degré élevé de cohérence des données via la base de données sans encombrer l'application.

  6. Partager des règles commerciales définies dans la base de données par différentes applications sans coder le même code dans différentes applications.

Cela dit, la normalisation produit une structure optimale pour toutes les colonnes et toutes les tables. Ce n'est peut-être pas toujours nécessaire dans votre application particulière, vous pourriez alors déterminer, étant donné votre compréhension de votre domaine et votre application, de désalminifier certaines des tables/colonnes comme compromis à la vitesse. Cependant, ce serait une décision consciente plutôt qu'une supervision.

Compte tenu d'un ensemble FD 3NF et d'un ensemble de requêtes, comment puis-je prédire la vitesse/ralentissement de la dés-normalisation?

Vous ne pouvez pas prédire les performances avec précision sans tests (que vous pouvez faire avant d'écrire le code de l'application). Cependant, vous pouvez éliminer et détecter des facteurs qui entraîneraient une mauvaise performance par la conception. Par exemple, vous pouvez identifier la stratégie d'index à utiliser comme suit (d'autres techniques peuvent exister):

  1. Construisez une matrice de requêtes et de colonnes affectées par ces requêtes.

  2. Trouvez les colonnes qui sont les plus utilisées.

  3. Considérez des index de construction sur ces colonnes.

C'est principalement un travail où votre DBA pourrait vous aider. Il y a plus à la performance que la normalisation. Il existe des aspects de la distribution des données sur les volumes de disque, la division de la table verticale, le partitionnement, les types d'index et la mise en mémoire tampon d'index pour nommer quelques-uns. Toutes ces techniques doivent être adressées dans la documentation des livres et des fournisseurs sous "Conception de la base de données" et "Tuning de performance de la base de données". Toute la discussion ci-dessus suppose que votre application est un OLTP Applications.

1
NoChance

Je ne suis pas sûr qu'il y ait une recherche académique sur la dénormalisation peut vous aider (IMHO, il y a une grande différence entre ce qui est enseigné à propos de la normalisation de la DB et de la manière dont cela fonctionne dans la pratique).

Cependant, il y a plusieurs articles intéressants et des entrées de blog à propos de ce que Jeff Atwood parle de normaliser dans son blog , et il y a une "Répondre" à lui à haute évolutivité.

Lorsque vous dénormalisez, je vous suggère de faire attention à

  • le nombre et le type de requêtes par unité de temps; Si vous utilisez l'insertion et/ou la mise à jour plus que la lecture, la dénormalisation ne serait pas beaucoup d'aide.
  • combien de fois les informations dupliquées seront mises à jour
  • les caractéristiques du SGBD que vous utiliserez
  • combien de fois les informations sont dupliquées; Si vous avez la même information dans 4-5 tables, il peut être plus rapide de le garder dans une table séparée plutôt que de la copier tant de fois
  • la quantité attendue de données conservées dans la DB; Ce qui pourrait fonctionner pour de petites quantités de données, peut conduire à une catastrophe si le nombre d'enregistrements augmente. Et vice verset (je veux dire le KISS principe et ne pas résoudre ce qui n'est pas cassé).
1
superM