Quand faut-il dénormaliser?

45

Je pense que nous sommes tous familiers avec la normalisation des bases de données .

Ma question est la suivante: quelles sont les directives que vous utilisez lorsque vous souhaitez dénormaliser les tables?

Richard
la source
3
Les sites StackExchange ont un avantage unique sur les autres sites Internet en ce sens qu'ils 1) permettent aux meilleures réponses de devenir les plus faciles à trouver et 2) les meilleures réponses sont déterminées par la communauté. À cause de cela, je crois que ce site Internet et bénéficieraient de cette question, malgré qu'il sorte de va à l' encontre de la faq .
Richard
2
doublon possible de Jusqu'où faut-il aller avec la normalisation?
Jack Douglas
1
Informations possibles en double / connexes Quand dénormaliser la base de données
John Sansom

Réponses:

34

Dénormaliser lorsqu'il s'agit d'opérations OLAP, normaliser lorsque OLTP (extrait de l'article lié dans la section Dénormalisation)

Les bases de données destinées au traitement des transactions en ligne (OLTP) sont généralement plus normalisées que celles qui sont destinées au traitement analytique en ligne (OLAP). Les applications OLTP se caractérisent par un volume élevé de petites transactions, telles que la mise à jour d'un enregistrement des ventes à une caisse de supermarché. On s'attend à ce que chaque transaction laisse la base de données dans un état cohérent. En revanche, les bases de données destinées aux opérations OLAP sont principalement des bases de données "principalement lues". Les applications OLAP ont tendance à extraire les données historiques accumulées sur une longue période. Pour ces bases de données, des données redondantes ou "dénormalisées" peuvent faciliter les applications de business intelligence. Plus précisément, les tables dimensionnelles d'un schéma en étoile contiennent souvent des données dénormalisées. Les données dénormalisées ou redondantes doivent être soigneusement contrôlées lors du traitement de l'extraction, de la transformation, du chargement (ETL), et les utilisateurs ne doivent pas être autorisés à voir les données tant qu'elles ne sont pas dans un état cohérent. L'alternative normalisée au schéma en étoile est le schéma en flocon de neige. Dans de nombreux cas, le besoin de dénormalisation a diminué à mesure que les ordinateurs et les logiciels de SGBDR devenaient plus puissants, mais comme les volumes de données ont généralement augmenté parallèlement aux performances matérielles et logicielles, les bases de données OLAP utilisent encore souvent des schémas dénormalisés.

La dénormalisation est également utilisée pour améliorer les performances sur des ordinateurs plus petits, comme dans les caisses enregistreuses informatisées et les appareils mobiles, car ceux-ci peuvent utiliser les données uniquement à des fins de recherche (par exemple, les recherches de prix). La dénormalisation peut également être utilisée lorsqu'il n'existe aucun SGBDR pour une plate-forme (telle que Palm), ou qu'aucune modification ne doit être apportée aux données et qu'une réponse rapide est cruciale.

billinkc
la source
4
Je dénormalise lorsque je crée des rapports ou des analyses et que je veux des résultats rapides. Tous les index du monde comportant plusieurs jointures ne sont jamais aussi rapides qu’une table dénormalisée qui représente des données mises en cache qui ne vont pas changer.
Kevin
Succinct et très utile. Je travaille à la périphérie de DBA et cela aide à faire beaucoup de choses.
Jason P Sallinger
De nombreuses applications ont des exigences OLAP et OLTP. Chaque développeur back-end doit donc apprendre à les combiner et à maintenir à jour les données dénormalisées.
JustAMartin
22

Normalisez jusqu'à ce que vous ayez mal, dénormalisez jusqu'à ce que ça fonctionne (c.-à-d. Que les performances deviennent acceptables) :)

Andrei Rînea
la source
5
Ce n'est probablement pas la meilleure réponse, mais c'est l'un des meilleurs one-liners que j'ai vu sur Stack Overflow :)
Owen
15

Une raison potentiellement judicieuse d'appliquer une dénormalisation contrôlée est si cela vous permet d'appliquer une contrainte d'intégrité aux données qui ne serait autrement pas possible. La plupart des SGBD SQL ont un support extrêmement limité pour les contraintes multi-tables. En SQL, parfois, le seul moyen efficace d'implémenter certaines contraintes est de s'assurer que les attributs impliqués dans la contrainte sont tous présents dans la même table, même lorsque la normalisation voudrait qu'ils appartiennent à des tables séparées.

La dénormalisation contrôlée signifie que des mécanismes sont mis en œuvre pour éviter les incohérences dues à la redondance des données. Le coût de ces contrôles supplémentaires et le risque de données incohérentes doivent être pris en compte pour décider si la dénormalisation vaut la peine.

Une autre raison courante de dénormalisation est de permettre certaines modifications des structures de stockage ou une autre optimisation physique que le SGBD ne permettrait pas autrement. Selon le principe de l' indépendance physique des données, un SGBD doit avoir le moyen de configurer des structures de stockage internes sans modifier inutilement la représentation logique des données dans la base de données. Malheureusement, de nombreux SGBD limitent considérablement les options d'implémentation physique disponibles pour tout schéma de base de données donné. Ils ont tendance à compromettre l'indépendance de la base de données physique en ne prenant en charge qu'une mise en œuvre sous-optimale du modèle logique souhaité.

Cela devrait être évident, mais il reste à dire: dans tous les cas, seuls les changements apportés aux fonctionnalités d’implémentation physique peuvent influer sur les performances: fonctionnalités telles que les structures de données internes, les fichiers, l’indexation, le matériel, etc. La normalisation et la dénormalisation n'ont rien à voir avec l'optimisation des performances ou du stockage.

nvogel
la source
4

Dénormaliser si vous accédez fréquemment aux données calculées, comme suggéré dans les réponses à cette question . Le coût de stockage et de maintenance des données calculées sera souvent inférieur au coût de re-calcul à maintes reprises si votre profil de charge est lourd en lecture.

Nick Chammas
la source
Notez que cela est particulièrement utile si la dénormalisation consiste simplement à mettre en cache des valeurs. Il reste donc une collection sous-jacente normalisée de tables / champs. Autrement dit, pour chaque valeur, il devrait y avoir une seule cellule "maître" contenant cette valeur - les autres valeurs sont connues pour n'être que des copies ou des calculs de ce maître - et à moins qu'il ne soit très avantageux de le faire autrement, conservez toutes les cellules maîtres. dans des relations normalisées.
ToolmakerSteve
3

Je dénormalise régulièrement afin de pouvoir appliquer l'intégrité des données avec des contraintes. Un exemple est une question récente sur ce site - Je réplique une colonne dans une autre table, de sorte que je puisse utiliser une contrainte CHECK pour la comparer à une autre colonne. Un autre exemple de cette technique est mon article de blog .

Vous ne pouvez pas utiliser les contraintes CHECK pour comparer des colonnes de différentes lignes ou de différentes tables, sauf si vous encapsulez de telles fonctionnalités dans des fonctions UDF scalaires appelées sous la forme d'une contrainte CHECK. Que faire si vous avez réellement besoin de comparer des colonnes de différentes lignes ou de différentes tables pour appliquer une règle de gestion? Par exemple, supposons que vous connaissiez les heures de travail d'un médecin et que vous souhaitiez vous assurer que tous les rendez-vous tiennent dans les heures de travail? Bien sûr, vous pouvez utiliser un déclencheur ou une procédure stockée pour mettre en œuvre cette règle de gestion, mais ni un déclencheur ni une procédure stockée ne peuvent vous garantir à 100% que toutes vos données sont neutres - quelqu'un peut désactiver ou supprimer votre déclencheur, saisissez données sales, et réactivez ou recréez votre déclencheur. En outre, quelqu'un peut modifier directement votre table en contournant les procédures stockées.

Laissez-moi vous montrer comment implémenter cette règle de gestion en utilisant uniquement les contraintes FK et CHECK, ce qui garantira que toutes les données satisfont à la règle de gestion tant que toutes les contraintes sont approuvées.

Encore un autre exemple est un moyen de faire en sorte que les périodes de temps ne comportent ni lacunes ni chevauchements .

AK
la source
1
"Je procède régulièrement à une dénormalisation afin de pouvoir appliquer l'intégrité des données avec des contraintes." Pareil ici. C'est un bon compromis: vous dénormalisez un peu mais vous gagnez en DRI .
Nick Chammas
@ NickChammas - c'est très intéressant. Pouvez-vous partager des scénarios lorsque vous faites de telles choses?
AK
1
Certainement. Nous avons un système d’exécution qui comprend une file d’éléments à remplir. Il existe une Fulfillabletable avec tous les détails sur chaque élément pouvant être rempli, puis une FulfillableQueuetable qui implémente la file d'attente dans SQL Server . Seules les Fulfillables avec un certain StateIDpeuvent être dans la file d'attente. StateIDest dans la Fulfillabletable, mais je le réplique FulfillableQueuepuis l’applique à FOREIGN KEYet CHECKcontraintes.
Nick Chammas