Frage

In einer Datenbank-zentrierten Anwendung und ist konzipiert für mehrere Kunden, ich habe immer gedacht, es war "besser" zu verwenden, eine einzige Datenbank für ALLE clients - verknüpfen von Datensätzen mit der richtigen Indizes und Schlüssel.Im hören auf den Stack Overflow podcast, ich hörte Joel erwähnen, dass FogBugz verwendet eine Datenbank pro Mandant (also, wenn es wurden über 1000 Kunden, es würde werden 1000 Datenbanken).Was sind die Vorteile der Verwendung dieser Architektur?

Ich verstehe, dass für einige Projekte, müssen die clients den direkten Zugriff auf alle Ihre Daten - in einer solchen Anwendung ist es offensichtlich, dass jeder client benötigt eine eigene Datenbank.Jedoch, für Projekte, bei denen ein client nicht direkt auf die Datenbank zugreifen, gibt es irgendwelche Vorteile der Verwendung einer Datenbank pro Mandant?Es scheint, dass in Bezug auf Flexibilität, es ist viel einfacher zu verwenden, eine einzige Datenbank mit einer einzelnen Kopie der Tabellen.Es ist einfacher, neue features hinzuzufügen, ist es einfacher, Berichte zu erstellen, und es ist nur einfacher zu verwalten.

Ich war ziemlich zuversichtlich, in der "eine Datenbank für alle Kunden" - Methode, bis ich hörte, Joel (ein erfahrener Entwickler) zu erwähnen, dass seine software verwendet einen anderen Ansatz-und ich bin ein wenig verwirrt mit seiner Entscheidung...

Ich habe gehört, wie Leute zitieren, die Datenbanken verlangsamen, mit einer großen Anzahl von Datensätzen, aber keine relationale Datenbank mit einigen Verdienst ist nicht zu haben, die problem - vor allem, wenn die richtigen Indizes und Schlüssel verwendet werden.

Jede Eingabe wird sehr geschätzt!

War es hilfreich?

Lösung

Angenommen, es gibt keine Skalierung Strafe für die Speicherung alle Kunden in eine Datenbank;für die meisten Menschen, und auch konfiguriert Datenbanken Abfragen, das wird ziemlich wahr, in diesen Tagen.Wenn Sie nicht einer dieser Menschen sind, nun, dann ist der Vorteil einer einzigen Datenbank liegt auf der Hand.

In dieser situation, die Vorteile, die sich aus der Einbettung des jeweiligen Kunden.Aus der Perspektive code für jeden client, der existiert in isolation - es gibt keine situation, in der ein Datenbank-update möglicherweise überschrieben, beschädigt, abrufen oder verändern die Daten von einem anderen client.Dies vereinfacht auch das Modell, wie Sie nicht brauchen, um jemals die Tatsache berücksichtigen, dass Datensätze gehören zu einem anderen client.

Sie erhalten auch die Vorteile der Teilnichtigkeit - es ist trivial zu ziehen, die Daten, die im Zusammenhang mit einem bestimmten client aus ,und verschieben Sie Sie auf einen anderen server.Eine Sicherung oder Wiederherstellung des Kunden, wenn der Anruf, um zu sagen "Wir haben uns gelöscht einige wichtige Daten!", mit der eingebauten Datenbank-Mechanismen.

Erhalten Sie einfachen und kostenfreien server-Mobilität - wenn Sie outscale ein Datenbank-server, den Sie gerade host kann neue Kunden, die auf einem anderen server.Wenn Sie alle waren in einer Datenbank, würden Sie brauchen, um entweder beefier hardware an, oder führen Sie die Datenbank auf mehreren Rechnern.

Erhalten Sie einfachen Versionierung - wenn ein Kunde will, zu bleiben auf die software-version 1.0 und einen anderen will, 2.0, wobei 1.0 und 2.0 verwenden verschiedene Datenbank-Schemata, gibt es kein problem - Sie können migrieren, ohne dass Sie ziehen aus einer Datenbank.

Ich denke, der kann ein paar Dutzend mehr, denke ich.Aber alles in allem ist der Schlüsselbegriff ist "Einfachheit".Das Produkt schafft einen client, und damit eine Datenbank.Es gibt keine Komplexität aus ", Aber die Datenbank enthält auch andere Kunden" Problem.Es passt das mentale Modell des Benutzers, wo Sie existieren allein.Vorteile wie die Möglichkeit, das zu tun einfache Berichterstattung auf allen clients auf einmal, minimal sind - wie oft wollen Sie einen Bericht über die ganze Welt, nicht nur ein client?

Andere Tipps

Hier ist ein Ansatz, den ich gesehen habe:

  • Jeder Kunde hat eine eindeutige Verbindungszeichenfolge gespeichert in einer master-Kunden-Datenbank.
  • Die Datenbank ist so konzipiert, dass alles segmented by CustomerID, auch wenn es einen einzigen Kunden in einer Datenbank.
  • Skripte werden erstellt, um die Migration aller Kunden-Daten in eine neue Datenbank, wenn nötig, und dann nur, dass der Kunde die Verbindungszeichenfolge muss aktualisiert werden, um auf den neuen Speicherort.

Dies ermöglicht die Verwendung einer einzigen Datenbank, auf den ersten, und dann leicht die Segmentierung später einmal haben Sie eine große Anzahl von Kunden, oder häufiger, wenn du ein paar Kunden, die überbeanspruchung des Systems.

Ich habe festgestellt, dass das wiederherstellen der spezifischen Kundendaten, ist wirklich schwierig, wenn alle Daten in derselben Datenbank, aber die Verwaltung von upgrades ist viel einfacher.

Wenn Sie eine einzelne Datenbank pro Kunde, Sie laufen in ein riesiges problem, dass alle Kunden mit gleichen schema version, und das nicht einmal in Betracht backup-jobs an einer ganzen Reihe von kundenspezifischen Datenbanken.Natürlich ist die Wiederherstellung von Daten ist einfacher, aber wenn Sie sicherstellen, dass Sie nicht dauerhaft Datensätze löschen (markieren Sie einfach mit einem flag gelöscht oder Umzug in eine Archiv-Tabelle), dann haben Sie weniger Notwendigkeit für die Wiederherstellung der Datenbank in den ersten Platz.

Um es einfach zu halten.Sie können sicher sein, dass Ihre Kunden sehen nur Ihre Daten.Der client mit weniger Datensätze nicht haben, um die Strafe bezahlen zu müssen, konkurrieren Sie mit Hunderten von tausenden von Datensätzen, die möglicherweise in der Datenbank, aber nicht die ihrigen.Ist mir egal, wie gut alles wird indiziert und optimiert, es werden Abfragen, die bestimmen, dass Sie müssen scan jedem Datensatz.

Gut, was passiert, wenn einer deiner Kunden erzählt, die Sie wiederherstellen einer früheren version Ihrer Daten, die aufgrund von einigen verkorksten import-job oder ähnliches?Sich vorstellen, wie Ihre Kunden sich fühlen würden, wenn Sie sagten Ihnen: "das können Sie nicht machen, da deine Daten geteilt zwischen all unseren Kunden" oder "Sorry, aber die änderungen gehen verloren, weil Kunde X forderte eine Wiederherstellung der Datenbank".

Wie für die Schmerzen der Modernisierung 1000 database Server auf einmal, einige ziemlich einfache Automatisierung sollte sich darum kümmern, dass.Solange jede Datenbank unterhält eine identische schema, dann ist es nicht wirklich ein Problem sein.Wir verwenden die Datenbank-pro-client-Ansatz, und es funktioniert gut für uns.

Hier ist ein Artikel über genau dieses Thema (ja, es ist MSDN, aber es ist eine Technologie, unabhängige Artikel): http://msdn.microsoft.com/en-us/library/aa479086.aspx.

Eine weitere Diskussion von multi-tenancy, wie Sie sich auf Ihre Daten Modell hier: http://www.ayende.com/Blog/archive/2008/08/07/Multi-Tenancy--The-Physical-Data-Model.aspx

Skalierbarkeit.Sicherheit.Unser Unternehmen verwendet 1 DB pro Kunde Ansatz.Es macht auch den code ein wenig einfacher zu pflegen als gut.

Ich bin einfach nur hinzufügen diese Antwort auf das Wort multi-tenant hier.Ich war auf der Suche nach diesem, mit "Multi-Tenant", wie die Abfrage, und diese erscheinen nicht.

Vielen Dank für deinen input -- alle sehr gut und sehr gültige Punkte.Ich nehme an, ich bin auf der Suche mehr auf upgrade-Flexibilität.Wenn Sie brauchen, um das schema zu ändern, um eine neue Funktion hinzuzufügen (sagen wir für eine web-Anwendung) oder zur Verbesserung bestehender Funktionen, es ist einfach zu tun, in einer einzigen Datenbank.Wenn Sie hatten, zu replizieren, diese änderung über 1000 separate Datenbanken, die Fehlerwahrscheinlichkeit erhöht.Was ist, wenn ein Vorgang fehlschlägt?Wie lange dauert es, um ein upgrade zu jedem client?

Wenn die entsprechenden sicherungen gehalten werden (oder wenn deine Datenbank aufgebaut, in denen Daten war nie wirklich überschrieben), wiederherstellen von Daten für einen bestimmten client ist trivial.

Die Einfachheit des Codes, während die wichtigen, nicht wirklich sehr kompliziert.Abhängig von der verwendeten Sprache und die Methoden, es ist einfach, Objekte zu erstellen, sind nur, dass bestimmte Kunden (die Speicherung eines bestimmten Client-ID) und der rest des Projekts hat nur codiert werden, für ein einzelnes Objekt (Art von wie ein einziger client).

Skalierbarkeit ist etwas zu Bedenken - du hast Recht, dass es einfach zu nehmen eine einzelne, isolierte Datenbank und verschieben Sie Sie auf einen anderen physischen server;jedoch, es ist immer einfacher cluster-Servern zusammen - und auch ohne clustering, es scheint, wie es sein würde, eine kleine Veränderung zu zeigen, die jeder client bei einem Datenbank-SERVER, dass hosts der universal database (so könnte man zwei oder drei Datenbank-Server hostet nur eine einzelne Datenbank jeden, zum Beispiel).Dieser Ansatz hält die upgrade-Prozess beschränkt sich auf nur drei Datenbanken.

In regulierten Branchen wie Gesundheitswesen kann es eine Anforderung für eine Datenbank pro Kunde, gegebenenfalls sogar einen separaten Datenbank-server.

Die einfache Antwort auf die Aktualisierung mehrere Datenbanken aus, wenn Sie upgrade, um das upgrade als eine Transaktion, und nehmen Sie einen Schnappschuss vor dem aktualisieren, wenn nötig.Wenn Sie Ihren Betrieb auch dann sollten Sie in der Lage zu führen Sie die Aktualisierung auf eine beliebige Anzahl von Datenbanken.

Clustering ist nicht wirklich eine Lösung für das problem der Indizes und full-table-scans.Wenn Sie auf einen cluster, sehr wenig ändert.Wenn Sie haben viele kleine Datenbanken zu verteilen über mehrere Maschinen, können Sie dies tun, mehr Billig ohne cluster.Zuverlässigkeit und Verfügbarkeit sind überlegungen, sondern können behandelt werden in andere Möglichkeiten (einige Leute noch brauchen, ein cluster, aber die Mehrheit wahrscheinlich nicht).

Ich wäre daran interessiert zu hören, ein wenig mehr Kontext über Sie, weil clustering ist kein einfaches Thema und ist teuer zu implementieren in der RDBMS-Welt.Es gibt viel Gerede/Draufgängertum über clustering-in der nicht-relationalen Welt Google Bigtable etc.aber Sie lösen verschiedene Probleme, und Sie verlieren einige der nützlichen Funktionen von einem RDBMS.

Es gibt eine Reihe von Bedeutungen des "Datenbank"

  • die hardware-box
  • das ausführen von software (z.B."oracle")
  • die bestimmten Satz von Daten-Dateien
  • die besonderen Anmelde-oder-schema

Es ist wahrscheinlich, Joel bedeutet, dass eine der unteren Ebenen.In diesem Fall, es ist nur eine Frage des software-configuration-management...Sie nicht haben, um patch-1000-software-Server zu beheben eine Sicherheitslücke, für Beispiel.

Ich denke, es ist eine gute Idee, so dass ein software-Fehler nicht Auslaufen Informationen über die Kunden.Stellen Sie sich den Fall mit ein fehlerhaftes where-Klausel, zeigte Sie mir Ihre Kundendaten als auch meine eigenen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top