60 votes

De quelle manière la dénormalisation améliore-t-elle les performances de la base de données?

J'ai beaucoup entendu parler de la dénormalisation, qui visait à améliorer les performances de certaines applications. Mais je n'ai jamais essayé de faire quoi que ce soit lié.

Donc, je suis juste curieux de savoir quels endroits dans les bases de données normalisées aggravent les performances ou, en d'autres termes, quels sont les principes de dénormalisation?

Comment puis-je utiliser cette technique si j'ai besoin d'améliorer les performances?

85voto

Pascal MARTIN Points 195780

La dénormalisation est généralement utilisé pour :

  • Éviter un certain nombre de requêtes
  • Supprimer certaines jointures

L'idée de base de la dénormalisation est que vous allez ajouter des données redondantes, ou groupe de certains, pour être en mesure d'obtenir les données plus facilement -- à un moindre coût, ce qui est mieux pour les performances.


Un rapide des exemples ?

  • Envisager une "Postes" et "Commentaires" de la table, pour un blog
    • Pour chaque Poste, vous aurez plusieurs lignes dans la partie "Commentaire" de la table
    • Cela signifie que, pour afficher une liste des messages avec le nombre de commentaires, vous aurez à :
      • Faire une requête pour lister les postes
      • Faire une requête par la poste à compter le nombre de commentaires (Oui, ceux qui peuvent être fusionnés en un seul, pour obtenir le nombre de tous les messages à la fois)
      • Ce qui signifie plusieurs requêtes.
  • Maintenant, si vous ajoutez un "nombre d'observations" dans la table Posts :
    • Vous avez seulement besoin d'une requête pour la liste des postes
    • Et pas besoin d'interroger les Commentaires du tableau : le nombre de commentaires qui sont déjà dé-normalisé à la table Posts.
    • Et une seule requête qui retourne un champ plus est mieux que plusieurs requêtes.

Maintenant, il y a des coûts, oui :

  • Tout d'abord, cela coûte un endroit à la fois sur disque et en mémoire, que vous avez un peu redondant d'informations :
    • Le nombre de commentaires qui sont stockées dans la table Posts
    • Et vous pouvez également trouver ces numéro de compte sur les Commentaires de la table
  • Deuxièmement, chaque fois que quelqu'un ajoute/supprime un commentaire, vous devez :
    • Enregistrer/supprimer le commentaire, bien sûr
    • Mais aussi, de mettre à jour le numéro correspondant dans la table Posts.
    • Mais, si votre blog a beaucoup plus de personnes de lecture que l'écriture des commentaires, ce n'est probablement pas si mauvais.

72voto

ewernli Points 23180

La dénormalisation est un espace-temps trade-off. Des données normalisées prend moins de place, mais peut exiger rejoindre pour construire les résultats souhaités, donc plus de temps. Si elle est anormale, les données sont répliquées dans plusieurs endroits. Il prend alors plus d'espace, mais la vue souhaitée des données est facilement disponible.

Il y a d'autres espace-temps optimisations, comme l'

  • dénormalisée vue
  • précalculées colonnes

Comme avec n'importe quel de ces approche, ce qui améliore la lecture des données (car ils sont facilement disponibles), mais la mise à jour des données devient de plus en plus coûteux (car vous avez besoin de mettre à jour les reproduire ou les données précalculées).

11voto

Walter Mitty Points 8726

Le mot "dénormalisation" conduit à la confusion des problèmes de conception. Essayer d'obtenir une haute performance de la base de données par la dénormalisation est comme essayer d'obtenir à votre destination par la conduite en dehors de New York. Elle ne vous dit pas où aller.

Ce que vous avez besoin est une bonne conception de la discipline, celle qui produit simple et design sonore, même si cette conception parfois des conflits avec les règles de normalisation.

Une telle conception de la discipline est de schéma en étoile. Dans un schéma en étoile, un fait unique table sert de plaque tournante d'une étoile de tables. Les autres tables sont appelées tables de dimension, et ils sont à la jante de la du schéma. Les dimensions sont reliés à la table de faits par des relations qui ressemblent aux rayons d'une roue. Schéma en étoile est essentiellement une manière de projeter multidimensionnelle de la conception sur un SQL de mise en œuvre.

Étroitement liées à la star schéma est le schéma en flocon, qui est un peu plus compliqué.

Si vous avez un bon schéma en étoile, vous serez en mesure d'obtenir une grande variété de combinaisons de vos données avec pas plus de un à trois voies de rejoindre, impliquant deux dimensions et une table de faits. Non seulement cela, mais de nombreux outils OLAP sera en mesure de déchiffrer votre star de la conception automatiquement, et vous donner pointer-et-cliquer, de forage vers le bas, et l'analyse graphique de l'accès à vos données sans programmation supplémentaire.

Conception de schéma en étoile parfois viole les deuxième et troisième formes normales, mais il en résulte plus de vitesse et de fleixibility pour les rapports et les extraits. Il est le plus souvent utilisé dans les entrepôts de données, data marts, et les bases de données des rapports. Vous aurez généralement besoin de bien meilleurs résultats à partir du schéma en étoile ou une autre de récupération de la conception orientée, que sur l'aveuglette "dénormalisation".

7voto

HLGEM Points 54641

Les questions critiques en matière de dénormalisation sont:

  • Décider des données à dupliquer et pourquoi
  • La planification de la façon de conserver les données en synchronisation
  • Refactoring des requêtes à utiliser le dénormalisée champs.

L'un des plus faciles types de dénormalisation est de remplir un champ d'identité à des tableaux pour éviter une jointure. Comme les identités ne devrait jamais changer, cela signifie que le problème de conserver les données en phase rarement. Par exemple, nous remplir de notre client id de plusieurs tables, car on a souvent besoin d'une requête par le client et ne pas necssarily besoin, dans les requêtes, les données dans les tableaux qui serait entre le client de la table et de la table nous interroger si les données ont été totalement normalisée. Il vous reste à faire une jointure pour obtenir le clinet nom, mais c'est mieux que de se joindre à 6 tables parent pour obtenir le nom du client lorsque c'est le seul morceau de données dont vous avez besoin à partir de l'extérieur de la table que vous interrogez.

Cependant, il n'y aurait aucun avantage à cela, sauf si on nous a souvent des requêtes où les données de l'intervenant tables était nécessaire.

Une autre commune denormailzation peut-être pour ajouter un nom de domaine à d'autres tables. Que les noms sont inhernetly variable, vous devez vous assurer que les noms de rester en phase avec les déclencheurs. Mais si cela vous évite de se joindre à 5 tables au lieu de 2, il peut être vaut le coût de le légèrement plus long d'insertion ou de mise à jour.

3voto

marc_s Points 321990

Si vous avez certaines, comme la création de rapports, etc., il peut aider à éliminer votre base de données de diverses façons:

  • l'introduction de certaines de duplication des données à enregistrer vous-même certaines Jointures (par exemple, remplir certaines informations dans une table et être ok avec les données dupliquées, de sorte que toutes les données dans cette table et n'a pas besoin d'être trouvé par se joindre à une autre table)

  • vous pouvez pré-calculer certaines valeurs et de les stocker dans une colonne de table, insteda de calcul à la volée, à chaque fois pour interroger la base de données. Bien sûr, ces valeurs calculées peuvent obtenir "obsolètes au fil du temps, et vous pourriez avoir besoin de re-calculer, à un certain point, mais il suffit de lire une valeur fixe est généralement moins cher que le calcul de quelque chose (par exemple le comptage des lignes enfants)

Il y a certainement plus de moyens pour éliminer un schéma de base de données pour améliorer les performances, mais vous avez juste besoin d'être conscient que vous ne vous retrouvez dans une certaine mesure, de la difficulté à le faire. Vous devez peser soigneusement les avantages et les inconvénients - les avantages de performance contre les problèmes que vous vous retrouvez dans - lors de la prise de ces décisions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X