Ist es eine schlechte Praxis, Beziehungen zwischen separaten Datenbanken zu haben?


8

Ich arbeite mit einem Client, der mehrere Datenbanken hat. Es gibt mehrere masterLevel-Datenbanken, zu denen Beziehungen von instanceLevel-Datenbanken (anwendungsspezifische DBs) zurückliegen. Die Beziehungen von instancebis mastersind ganzzahlige Werte, die einen Primärschlüssel für Tabellen in der darstellen master. Die Ansichten und gespeicherten Prozeduren in instancessind so eingerichtet, dass Daten masterüber diese gespeicherten Schlüssel geladen werden.

Offensichtlich gibt es keine echte referenzielle Integrität, aber ist das eine schlechte Praxis oder sollten sich die Daten in schreibgeschützten Tabellen in den instanceDatenbanken befinden?

Antworten:


8

Das einzige Problem ist, dass es keinen bequemen Weg gibt , diese Beziehungen durchzusetzen . Sie können eine Schiffsladung Trigger verwenden oder die Mastertabelle in jeder Instanzdatenbank speichern und einfach alle als Metadaten für den Master verfügbar machen, möglicherweise mithilfe einer Ansicht.

Der größte Nachteil, denke ich, hat damit zu tun, dass die Daten in mindestens drei Szenarien genau und synchron gehalten werden (all dies kann auch dann ein Problem sein, wenn Sie Trigger verwenden):

  • Falsch koordinierte datenbankübergreifende Transaktionen - Beispielsweise fügt eine Transaktion dem Master eine neue Zeile hinzu, übergibt die Identität an eine andere Transaktion, und die erste Transaktion wird zurückgesetzt.
  • Wiederherstellung nach einem einzelnen Datenbankfehler - Eine Datenbank stürzt ab. Sie müssen zu einem Zeitpunkt wiederherstellen, der möglicherweise vor Abschluss anderer erfolgreicher Transaktionen in anderen Datenbanken lag. Dies kann bedeuten, dass, wenn eine Instanzdatenbank auf einen früheren Zeitpunkt zurückgesetzt werden muss, Zeilen fehlen, die der Master erwartet. Wenn der Master zurückgesetzt werden muss, haben möglicherweise alle Instanzdatenbanken Werte, die im Master nicht vorhanden sind.
  • Sicherungskonsistenz im Allgemeinen - Wenn Sie eine Notfallwiederherstellung benötigen, wird es Ihnen schwer fallen, alle Ihre vollständigen und protokollierten Sicherungen bis zu einem bestimmten Zeitpunkt transaktionskonsistent zu halten. Dateisystem-Snapshots helfen dabei nicht, und selbst Verfügbarkeitsgruppen garantieren keine datenbankübergreifende Transaktionskonsistenz für die Datenbanken in einer einzelnen Verfügbarkeitsgruppe. Wenn Sie eine Katastrophe haben und Ihre Datenbanken auf einem neuen System wiederherstellen müssen, können Sie nicht sicher sein, dass sie transaktionskonsistent sind.

Alles in allem war und bin ich immer ein Fan davon, Mieter in ihre eigenen Datenbanken aufzuteilen, und ich erkenne an, dass mit der zentralen Datenbank ein Risiko verbunden ist - aber es ist notwendig.

(Abgesehen davon sollten Sie andere Namen für Ihre Datenbanken als master / instance verwenden. masterIn SQL Server hat dies definitiv eine explizite Bedeutung, und selbst das Lesen meiner eigenen Wörter darüber kann mehrdeutig sein. Gleiches gilt für instance. In einem früheren Leben habe ich ein Multi ausgeführt -Mietersystem und wir haben die zentrale Datenbank Controlund die Mandantendatenbanken aufgerufen Tenants.)


2

Wenn Sie einer Architektur wie Microservices folgen, ist es ein Muss, Daten über mehrere autonome Dienste hinweg zu korrelieren, von denen jeder seinen eigenen Datenspeicher hat. Jeder Service wird verstehen, dass Geschäftsprozesse, die traditionell in einer einzelnen Datenbanktransaktion ausgeführt werden, möglicherweise länger dauern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.