Nous avons 3 copies de la même base de données exacte. Les 3 bases de données ont une Users
table et un utilisateur existera toujours dans les 3 bases de données avec exactement les mêmes paramètres. Chaque fois que nous voulons ajouter ou modifier un utilisateur, nous devons mettre à jour 3 bases de données.
Serait-il préférable de supprimer la Users
table des bases de données 2 et 3 et de la remplacer par une Synonym
qui pointe vers la base de données 1?
Voici les avantages / inconvénients auxquels je peux penser:
Avantages
- Maintenance simplifiée. Peut mettre à jour les utilisateurs dans un seul endroit au lieu de 3
- Les ID utilisateur correspondraient aux bases de données (important car de nombreuses applications complémentaires sont basées sur UserId)
Les inconvénients
- Ne pensez pas qu'il s'agit d'une procédure standard, cela pourrait donc prêter à confusion
- Les utilisateurs devraient avoir des paramètres identiques entre les bases de données
- (D'après la réponse de gbn ci-dessous) Si la base de données 1 tombe en panne, les bases de données 2 et 3 seront également indisponibles. Il existe également un problème potentiel d'incohérence des données en cas de restauration
C'est une option que j'envisage pour quelques tables différentes contenant des paramètres identiques entre les bases de données, pas seulement la Users
table. J'utilise les utilisateurs dans l'exemple car il est facile à comprendre.
la source
Réponses:
Pourquoi avez-vous 3 bases de données avec les mêmes utilisateurs?
Que se passe-t-il si une base de données tombe en panne maintenant?
Je pose ces questions parce que le Con de la base de données utilisateur-source en baisse empêchant l'utilisation des deux autres bases de données peut ne pas être un gros problème qu'il n'y paraît.
De plus, si une base de données tombe en panne maintenant, vous aurez déjà des problèmes de cohérence si les utilisateurs sont modifiés dans les deux autres bases de données au cours de cette période. Je ne pense pas que nous puissions donner les meilleurs conseils sans plus de contexte.
En ce moment, je créerais une quatrième base de données pour les utilisateurs, apporterais des modifications uniquement là-bas et synchroniserais avec les autres bases de données. Vous êtes déjà distribué-dénormalisé en modifiant essentiellement les mêmes données à trois endroits, et vous avez probablement déjà des problèmes de cohérence. Si la tolérance aux pannes est importante, ce schéma donne toujours cela tout en résolvant le problème des entrées multiples.
Je pense qu'avoir cette quatrième base de données uniquement utilisateur / paramètres plutôt que d'utiliser l'une de vos existantes est une bonne stratégie car elle devient moins susceptible de baisser car elle n'est pas liée à d'autres ressources ou fortement utilisée. Je vois maintenant que vous avez dit que vous ne pouvez pas faire cela, mais je ne sais pas pourquoi. Les applications de la base de données principale prennent-elles directement en charge la modification par l'utilisateur, ou la modification par l'utilisateur est-elle une fonction complètement distincte qui peut être indiquée ailleurs?
Certes, avec cette idée de "table d'utilisateurs canonique" - que vous utilisiez des synonymes ou synchronisiez les données - vous ne pouvez pas modifier les utilisateurs pendant une base de données d'utilisateurs en panne, mais cela me semble correct. Résolvez le problème et remontez-le! Une source, un endroit pour éditer, une chose à réparer en cas de panne. Avec la synchronisation, toutes les autres bases de données ont des copies temporaires sur lesquelles elles peuvent travailler, mais pas d'édition. Minimiser la duplication des données entre les systèmes est un objectif formidable et utile. Il est très difficile de saisir les mêmes données à trois endroits, alors faites tout ce que vous pouvez pour éliminer cela.
Pour répondre à plus de vos commentaires, si vos ID utilisateur sont différents dans toutes vos applications, vous devez sérieusement envisager un temps d'arrêt planifié pour vos deux nouvelles bases de données afin de les synchroniser avec la principale (posez une question distincte si vous avez besoin d'idées sur la façon d'accomplir cela, ce qui est délicat mais pas vraiment difficile).
Si vous analysez les besoins de votre entreprise et constatez que la base de données principale doit avoir les données utilisateur correctes, vous les utilisez toujours comme canoniques, puis choisissez entre les synonymes ou la synchronisation pour déterminer comment les temps d'arrêt imprévus affectent toutes les bases de données.
Un autre inconvénient de l'utilisation de synonymes est que vous ne pourrez plus disposer de FK appropriés pour les utilisateurs dans chaque base de données.
la source
Il manque un "Con"
Lors de la restauration, il est possible que votre utilisateur n'existe pas dans la base de données cible (du synonyme). Disons qu'il est corrompu et que vous devez restaurer à partir d'une sauvegarde.
Autrement dit, l'utilisation de synonymes supposera une intégrité référentielle entre bases de données qui ne peut pas se produire dans la vie réelle.
Une autre conséquence de cela serait des ID utilisateur incompatibles lorsque vous essayez de récupérer à partir de cela. (en ajoutant l'utilisateur après la restauration). Cependant, cela ne devrait jamais être supposé de toute façon en raison de l'intégrité référentielle entre les bases de données que j'ai mentionnée.
Alors ne fais pas ça ...
Une réponse connexe sur dba.se: critères de décision sur le moment d'utiliser un schéma non-dbo par rapport à une nouvelle base de données sur "l'intégrité référentielle entre bases de données" après les restaurations
la source
Selon votre plateforme de base de données, une autre option consiste à supprimer les tables des bases de données 2 et 3 et à les remplacer par des vues matérialisées de la table de la base de données 1.
Avantages
Les inconvénients
Notez également qu'en fonction de la fréquence des recherches, de la fréquence des rafraîchissements et de la fréquence des changements de données, cela peut ou non introduire plus de charge qu'une solution synonyme.
Mise à jour: le commentaire de FrustratedWithFormsDesigner est essentiellement une vue matérialisée pour les plates-formes qui ne peuvent pas faire de vues matérialisées. À l'aide d'un script, les tables pourraient être périodiquement synchronisées. Si une base de données est désignée comme maître, tous les scripts peuvent effectuer leurs modifications en fonction de celle-ci. Cela aurait tous les avantages et les inconvénients d'une vision matérialisée; il ne pouvait tout simplement pas tirer parti des fonctionnalités intégrées.
la source
Je créerais une 4ème base de données qui stocke les informations utilisateur partagées. Créez
Synonyms
ouViews
dans chacun des autres Dbs pointant vers la base de données des utilisateurs.Enfin, je créerais une table d'extension (une table avec une relation un à un avec 'UserDB.Usertable') dans chacun des 3 dbs existants qui contient des données utilisateur spécifiques à cette application.
Modifier: basé sur le commentaire ci-dessous
Dans ce cas, faites en sorte que la première base de données agisse comme table utilisateur principale.
Synonyms
et une table d'extension dans chacun des autres Dbs.Remarque importante : avec cette approche, si votre première application tombe en panne, les deux autres sont supprimées avec elle! Assurez-vous que tout le monde comprend cet inconvénient.
la source