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?
database-design
Richard
la source
la source
Réponses:
Dénormaliser lorsqu'il s'agit d'opérations OLAP, normaliser lorsque OLTP (extrait de l'article lié dans la section Dénormalisation)
la source
Normalisez jusqu'à ce que vous ayez mal, dénormalisez jusqu'à ce que ça fonctionne (c.-à-d. Que les performances deviennent acceptables) :)
la source
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.
la source
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.
la source
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 .
la source
Fulfillable
table avec tous les détails sur chaque élément pouvant être rempli, puis uneFulfillableQueue
table qui implémente la file d'attente dans SQL Server . Seules les Fulfillables avec un certainStateID
peuvent être dans la file d'attente.StateID
est dans laFulfillable
table, mais je le répliqueFulfillableQueue
puis l’applique àFOREIGN KEY
etCHECK
contraintes.