Verfügen Datenbanken mit mehreren Mandanten über mehrere Datenbanken oder gemeinsam genutzte Tabellen?

24

Ist eine mandantenfähige Datenbank:

  • Ein DB-Server, der für jeden Kunden / Mandanten eine andere (identische) Datenbank / ein anderes Schema hat ?; oder
  • Ein DB-Server mit einer Datenbank / einem Schema, auf dem Kunden / Mandanten Datensätze in denselben Tabellen gemeinsam nutzen?

Zum Beispiel könnte ich unter Option # 1 oben einen MySQL-Server an haben mydb01.example.com, und es könnte sich eine customer1Datenbank darin befinden. Diese customer1Datenbank kann beispielsweise 10 Tabellen enthalten, die meine Anwendung für diesen bestimmten Kunden (Kunde Nr. 1) unterstützen. Möglicherweise enthält es auch eine customer2Datenbank mit genau den gleichen 10 Tabellen, die jedoch nur Daten für Kunde 2 enthält. Möglicherweise gibt es eine customer3Datenbank, eine customer4Datenbank usw.

In der obigen Option 2 würde es beispielsweise nur eine einzige Datenbank / ein einziges einziges einziges Schema geben, myapp_dbin dem sich wiederum 10 Tabellen befinden (die gleichen wie oben). Aber hier sind die Daten für alle Kunden in diesen 10 Tabellen vorhanden, und sie "teilen" daher die Tabellen. Und auf der Anwendungsebene wird durch Logik und Sicherheit gesteuert, welche Kunden auf welche Datensätze in diesen 10 Tabellen zugreifen können, und es wird sorgfältig darauf geachtet, dass sich Kunde Nr. 1 niemals in der App anmeldet und die Daten von Kunde Nr. 3 usw. sieht.

Welches dieser Paradigmen stellt eine traditionelle "mandantenfähige" DB dar? Und wenn nicht, kann mir dann jemand anhand der oben beschriebenen Szenarien ein Beispiel für eine mandantenfähige Datenbank geben?

smeeb
quelle
"Multi-Tenant" bedeutet starke Sicherheit - irgendwo implementiert - so dass ein Tenant die Daten anderer nicht sehen, nicht ändern, nicht verweigern kann, usw. Diese Sicherheit muss irgendwie implementiert werden. Die Optionen 1 und 2 des OP funktionieren beide, aber die Sicherheitsanalyse und die für die Implementierung der Sicherheit erforderliche Arbeit sind unterschiedlich. Ich habe bei einem Startup gearbeitet, das eine Mandantenfähigkeit über Option 2 implementiert hat, bei der die Tabellen - mit Zeilen, die mehreren Mandanten gehören - (über Berechtigungen) für alle Endbenutzer ausgeblendet wurden und die Sicherheit vollständig in gespeicherten Prozeduren implementiert wurde.
Davidbak
1
Wenn dies als Duplikat abgeschlossen wird, sollten wir es meines Erachtens mit dem Dupe-Ziel zusammenführen, da beide Fragen einige wirklich gute Antworten haben.

Antworten:

29

Welches dieser Paradigmen stellt eine traditionelle "mandantenfähige" DB dar?

Beide Konzepte werden als mandantenfähig bezeichnet, da es sich lediglich um ein logisches Konzept handelt, "bei dem eine einzelne Instanz von Software auf einem Server ausgeführt wird und mehrere Mandanten bedient" (aus Wikipedia ). Aber wie Sie dieses Konzept "physisch" umsetzen, liegt bei Ihnen.

Natürlich benötigt die Anwendung ein Datenbankkonzept, mit dem die Daten verschiedener Mandanten getrennt werden können, und die Idee der Mandantenfähigkeit besteht darin, einige Serverressourcen (zumindest die Hardware) gemeinsam zu nutzen, um die Ressourcennutzung zu verbessern und die Verwaltung zu vereinfachen. Eine "mandantenfähige DB" unterstützt dies also direkt , wenn Teile des Datenbankmodells oder Tabellen gemeinsam genutzt werden.

Um genau zu sein, ist es möglich, eine mandantenfähige Anwendung mit einer mandantenfreien Datenbank zu erstellen, die eine einzelne DB-Instanz pro Client bereitstellt. Dies schließt jedoch die direkte gemeinsame Nutzung von Datenbankressourcen zwischen Mandanten aus, und die Anwendungsschicht muss sicherstellen, dass der richtige Mandant mit der richtigen Datenbank verbunden ist.

Doc Brown
quelle
Vielen Dank @ Doc Brown (+1), aber wie könnten Sie möglicherweise eine Datenbank haben, die nicht mandantenfähig war ?!?
Smeeb
4
@smeeb: Mandantenfähigkeit ist eine Eigenschaft der Anwendung, die von verschiedenen Mandanten verwendet wird, nicht der Datenbank "hinter" der Anwendung. Natürlich muss das db-Konzept die Mandantenfähigkeit unterstützen, um dies zu ermöglichen.
Doc Brown
4
@smeeb: Angenommen, Sie haben eine Benutzertabelle mit der Einschränkung, dass der Benutzername eindeutig ist. Jetzt kann ein Mitarbeiter eines Mandanten keinen Benutzernamen mehr verwenden, nur weil ihn bereits ein anderer Mitarbeiter eines anderen Mandanten verwendet.
RemcoGerlich
5
@smeeb: Wenn die einzige Möglichkeit, zwei Mandanten zu bedienen, darin besteht, eine Anwendung zweimal auf zwei verschiedenen Servern mit zwei separaten Datenbanken zu installieren und auszuführen, würde man diese Mandantenfähigkeit meines Erachtens nicht nennen.
Doc Brown
1
Ich habe vor einiger Zeit eine Präsentation zu Azure besucht, in der stand, dass MYOB seine Cloud-Lösung auf Azure ausführt und jeder Mandant seine eigene Datenbank (und vermutlich auch Webserver) erhält. Sie haben nur einige großartige Automatisierungstools, um die Hunderte von DB-Instanzen zu verwalten, die erforderlich sind. Andererseits führt die Organisation, für die ich derzeit arbeite, Hunderte von Kunden aus einer einzigen Datenbank aus. In der Software ist nur ein erheblicher Arbeitsaufwand erforderlich, um die Isolierung der Kundendaten durchzusetzen. Wir haben auch einen Hybrid in Betracht gezogen, bei dem unsere größten Kunden ihre eigene DB bekamen, während andere das Original teilten.
David Keaveny
36

Laut Microsoft hat der Begriff drei mögliche Bedeutungen (eine Datenbank für alle Mandanten oder einen Datenlaser pro Mandant).

Um Ihr Beispiel zu verwenden, wäre jeder Kunde sein eigener Mieter.

  1. Eine Datenbank pro Mieter (Kunde)

    • Jeder Mieter ist von den anderen isoliert (kein versehentlicher Zugriff auf die Daten anderer Mieter)
    • Die Isolierung erleichtert auch die Verwaltung der Wiederherstellung von Daten sowie die Anpassung des Speicherbedarfs an die Bedürfnisse der Mandanten.
  2. Eine gemeinsam genutzte Datenbank, separates Schema.

    • Jeder Mandant verfügt über ein eigenes Schema und seine Daten befinden sich in eigenen Tabellen.
    • Das Wiederherstellen kann zeitaufwändiger sein, da sich alle Benutzer in derselben Datenbank befinden. Sie können die Datenbank nicht einfach auf eine frühere Sicherung zurücksetzen (dies würde die Daten aller Mandanten zurücksetzen). Eine Option besteht darin, in einer neuen Datenbank wiederherzustellen und dann nur die Daten der 1 Mandanten zusammenzuführen / zu kopieren.
  3. Eine gemeinsam genutzte Datenbank, ein gemeinsam genutztes Schema.

    • Die Daten aller Mieter befinden sich in denselben Tabellen. Wenn Sie beispielsweise Bestellungen verfolgen, befinden sich die Bestellungen aller Mieter in "dbo.Orders".
    • Die Daten der Mandanten werden in jeder Tabelle durch eine Spalte (möglicherweise TenantId) getrennt, die den Besitzer der Zeile anzeigt.

In diesem Artikel werden die Vor- und Nachteile erläutert: https://msdn.microsoft.com/en-us/library/aa479086.aspx

Bonus: Sie können sich das als Wohnviertel vorstellen (grob vereinfacht).

  1. Jeder Mieter hat sein eigenes Haus. Sie können tun, was sie wollen, und wenn es niederbrennt, betrifft es niemanden wirklich.

  2. Jeder Mieter ist im selben Gebäude, hat aber eine eigene Wohnung.

  3. Jeder wohnt in der gleichen Wohnung und alle Sachen sind mit einem Haftnotiz versehen, um zu zeigen, wem sie gehören.

lmms90
quelle
2
Vielen Dank für Ihre Antwort. Könnten Sie bitte Ihre Antwort ein wenig ausarbeiten. Das würde eine bessere Antwort schaffen.
Thomas Junk
1
Ihr Bonusbeispiel ist awesome @ imms90
Aravin
3
Microsoft hat die von Ihnen über MSDN verknüpfte Seite gelöscht. Die Wayback-Maschine hat noch eine Kopie.
Mike Sherrill 'Cat Recall'
1
Ein ähnlicher Artikel von MS (möglicherweise derselbe, der umgezogen ist): docs.microsoft.com/en-us/azure/sql-database/…
Pierre Henry