La relation entre des bases de données séparées est-elle une mauvaise pratique?


8

Je travaille avec un client qui possède plusieurs bases de données. Il existe plusieurs masterbases de données de niveau qui ont des relations avec elles à partir de instancebases de données de niveau (bases de données spécifiques à l'application). Les relations de instanceà mastersont des valeurs entières qui représentent une clé primaire aux tables dans le master. Les vues et les procédures stockées dans le instancessont configurées pour charger des données à partir de masterces clés stockées.

Évidemment, il n'y a pas d'intégrité référentielle réelle, mais est-ce une mauvaise pratique ou les données doivent-elles résider dans des tables en lecture seule dans les instancebases de données?

Réponses:


8

Le seul problème est qu'il n'y a pas vraiment de moyen pratique de faire respecter ces relations. Vous pouvez utiliser une cargaison de déclencheurs, ou stocker la table principale dans chaque base de données d'instance et les exposer simplement en tant que métadonnées au maître, en utilisant peut-être une vue.

Le plus gros inconvénient, je pense, a à voir avec le maintien de la précision et de la synchronisation des données, dans au moins trois scénarios au dessus de ma tête (qui peuvent toujours être un problème même si vous utilisez des déclencheurs):

  • transactions inter-bases de données mal coordonnées - par exemple, une transaction ajoute une nouvelle ligne à maîtriser, transfère l'identité à une autre transaction, puis la première transaction est annulée.
  • récupération après une seule défaillance de la base de données - une base de données se bloque, vous devez la restaurer à un moment donné, peut-être avant la fin des autres transactions réussies dans d'autres bases de données. Cela peut signifier que si une base de données d'instance doit revenir à une date antérieure, il manque des lignes attendues par le maître; si le maître doit revenir, il est possible que toutes les bases de données d'instance aient des valeurs qui n'existent pas dans le maître.
  • cohérence de la sauvegarde en général - si vous avez besoin d'une reprise après sinistre, vous aurez du mal à conserver toutes vos sauvegardes complètes et de journaux transactionnellement cohérentes à un moment donné. Les instantanés du système de fichiers n'y contribuent pas, et même les groupes de disponibilité ne garantissent pas la cohérence transactionnelle entre les bases de données pour les bases de données d'un même groupe de disponibilité. Si vous avez un sinistre et devez restaurer vos bases de données sur un nouveau système, il n'y a aucun moyen d'être sûr qu'elles seront cohérentes sur le plan des transactions.

Cela dit, j'ai toujours été et serai toujours un fan de la séparation des locataires dans leurs propres bases de données, et je reconnais qu'il y a un risque associé à la base de données centrale - mais c'est nécessaire.

(En passant, vous devez utiliser des noms pour vos bases de données autres que master / instance. masterDans SQL Server a certainement une signification explicite, et même en lisant mes propres mots ci-dessus, ils pourraient être ambigus. Idem pour instance. Dans une vie antérieure, j'ai exécuté un multi et nous avons appelé la base de données centrale Controlet les bases de données des locataires, eh bien ,. Tenants)


2

Si vous suivez une architecture comme les microservices, il est à peu près indispensable de pouvoir corréler les données entre plusieurs services autonomes, chacun avec son propre magasin de données. Chaque service comprendra que les processus métier qui étaient traditionnellement exécutés dans une seule transaction de base de données peuvent désormais être potentiellement plus longs.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.