Frage

ich auf einer PHP-Anwendung arbeite, die Unternehmens-Workflow und Projektmanagement erleichtern will, sagen wir mal so etwas wie Basislager und GoPlan .

Ich bin nicht sicher, was der beste Ansatz ist, Datenbank-weise. Sollte ich eine einzige Datenbank verwenden und kundenspezifische Spalten zu jeder der Tabellen hinzuzufügen, oder sollte ich eine Datenbank für jeden neuen Kunden erstellen? Ein wichtiger Faktor ist die Automatisierung. Ich kann es einfach tot sein wollen einen neuen Client (und vielleicht die Möglichkeit, sich anmelden zu öffnen) zu erstellen

Mögliche Nachteile I der Verwendung einer Datenbank denken kann:

  • Mangel an Dehnbarkeit
  • Sicherheitsprobleme (obwohl Bugs sollten in erster Linie nicht da sein )

Was sind Ihre Gedanken dazu? Haben Sie irgendwelche Ideen haben, welche Lösung die oben genannten Unternehmen sind höchstwahrscheinlich gewählt haben?

War es hilfreich?

Lösung

ich in der Regel hinzufügen ClientID auf alle Tabellen und gehen mit einer Datenbank. Aber da die Datenbank in der Regel schwierig ist, ich auch maßstäblich wird es möglich, auf verschiedenen Datenbankinstanzen für einige oder alle Clients ausgeführt werden.

Auf diese Weise können Sie eine Reihe von kleinen Kunden in einer Datenbank haben und die großen auf separaten Servern.

Ein Schlüsselfaktor für die Wartbarkeit ist jedoch, dass Sie das Schema in allen Datenbanken identisch halten. Es wird Kopfschmerzen genug sein, um die Versionsverwaltung zu verwalten, ohne kundenspezifische Schemata eingeführt werden.

Andere Tipps

Hören Sie sich den Podcast-Stackoverflow, wo Joel und Jeff über die gleiche Frage sprechen. Joel spricht über ihre Erfahrung eine gehostete Version ihrer Software anbieten. Er weist darauf hin, dass der Client des Hinzufügen ids ganze DB das Design und Code kompliziert (sind Sie sicher, dass Sie nicht aus Versehen vergessen es einig hinzufügen WHERE-Klausel?) Und verkompliziert Feature-Hosting, wie kundenspezifische Backups.

Es war in der Episode # 20 oder # 21 (überprüfen Sie die Transkripte für Details).

Aus meiner Sicht wird es auf Ihrem wahrscheinlich Kunden abhängen. Wenn Sie in eine Situation geraten könnten, wo Erzrivalen sowohl mit Ihrem System sind, dann würden Sie besser dran mit separaten Datenbanken sein. Es hängt auch davon ab, wie mehrere Datenbanken von Ihrem DBMS implementiert bekommen. Wenn jede Datenbank eine separate Kopie der Infrastruktur hat, dann legt nahe, dass eine einzelne Datenbank (oder eine Änderung des DBMS). Wenn mehrere Datenbanken von einer einzigen Kopie der Infrastruktur bedient werden, dann würde ich für separate Datenbanken gehen.

Denken Sie an Datenbank-Backup. Kunde A sagt: „Bitte senden Sie mir eine Kopie meiner Daten“. Viel, viel leichter in einem separaten Datenbank-Setup, als wenn eine einzelne Datenbank gemeinsam genutzt wird. Denken Sie einen Kunden zu entfernen; wieder, viel einfacher, mit separaten Datenbanken.

( ‚Infrastruktur‘ Teil ist mehlig Mund, weil es große Unterschiede zwischen den verschiedenen DBMS über sind, was eine ‚Datenbank‘ im Vergleich zu einem ‚Server-Instanz‘, zum Beispiel Hinzufügen . Die Frage ist, tagged 'mysql', so vielleicht diese Gedanken sind nicht ganz relevant.)

Hinzufügen : Ein weiteres Problem - mit mehreren Kunden in einer einzigen Datenbank, jede SQL-Abfrage brauchen werden, um sicherzustellen, dass die Daten für die richtigen Kunden gewählt werden. Das bedeutet, dass der SQL schwieriger sein wird, zu schreiben und zu lesen, und das DBMS ist zu haben, härter zu arbeiten, um die Daten zu verarbeiten und Indizes wird größer sein, und ... Ich würde wirklich mit einer separaten Datenbank pro Kunde für viele Zwecke.

ist klar, Stackoverflow (als Beispiel) nicht über eine separate Datenbank pro Benutzer; wir alle verwenden die gleiche Datenbank. Aber wenn Sie Abrechnungssysteme für verschiedene Firmen ausgeführt wurden, ich glaube nicht, dass es akzeptabel sein (zu den Unternehmen und möglicherweise nicht die gesetzlichen Personen) Datenbanken zu teilen.

  • ENTWICKLUNG Für die schnelle Entwicklung, verwenden Sie eine Datenbank pro Kunde. Denken Sie, wie einfach es zu sichern sein wird, wiederherstellen oder eine Kundendaten löschen. Oder messen / Monitor / bill-Nutzung. Sie werden keinen Code schreiben müssen, es selbst zu tun, nur Ihre Datenbank Primitiven verwendet werden.

  • PERFORMANCE Für Leistung, verwenden Sie eine Datenbank für alle. Denken Sie über Verbindungs-Pooling, Shared Memory, Caching, etc.

  • BUSINESS Wenn Ihr Business-Plan viele kleine Kunden zu haben ist (man denke an hotmail) Sie wahrscheinlich auf einem einzigen DB funktionieren sollte. Und hat alle administrativen Aufgaben wie Registrierung, Löschung, Datenmigration, usw. vollständig automatisiert und in einer bedienerfreundlichen Schnittstelle ausgesetzt. Wenn Sie planen, Dutzende oder bis zu einigen hundert großen Kunden haben, dann können Sie in einem DB pro Kunde arbeiten und Systemadministration Skripte an der richtigen Stelle, die von Ihrem Kunden-Support-Personal bedient werden kann.

Die folgenden Screencasts erklärt, wie es auf salesforce.com getan hat. Sie nutzen eine Datenbank mit einer speziellen Spalte OrgId der jeden Mieter der Daten identifiziert. Es gibt viel mehr zu, dass, so dass Sie in dieser aussehen sollen. Ich würde mit ihrem Ansatz gehen.

Es gibt einen anderen großen Artikel darüber auf MSDN. Es wird erläutert, in der Tiefe, wenn Sie einen gemeinsamen oder isoliert Ansatz verwenden sollten. Denken Sie daran, dass eine gemeinsame DB mit für alle Mieter einige wichtige Auswirkungen auf die Sicherheit hat, und wenn sie alle gleichen teilen DB-Objekte Sie verwenden möchten [Zeilenebene Sicherheit] - je nach DBMS verwenden Sie (Ich bin sicher, dass es in MS möglich ist SQL Server und Oracle, wahrscheinlich in IBM DB2 auch). Sie können Tricks wie Zeilenebene Sicherheit in mySQL ähnliche Ergebnisse zu erzielen (Ansichten + Trigger ).

Für Multitenancy Leistung wird in der Regel die mehr Ressourcen erhöhen Sie verwalten über Mieter zu teilen finden Sie unter

http://en.wikipedia.org/wiki/Multitenancy

Also, wenn Sie können, gehen Sie mit der einzigen Datenbank. Ich bin damit einverstanden, dass Sicherheitsprobleme würden nur aufgrund von Fehlern auftreten, wie Sie alle Zugriffskontrolle in der Anwendung implementieren können. In einigen Datenbanken können Sie nach wie vor die Datenbank Zugriffskontrolle durch sorgfältige Verwendung von Ansichten verwenden (so dass jeder authentifizierte Benutzer bekommt eine andere Sicht).

Es gibt Möglichkeiten, auch Erweiterbarkeit bereitzustellen. Zum Beispiel könnten Sie eine einzelne Tabelle mit der Erweiterung Attributen (verkeilten durch Mieter, Basisdatensatz und Erweiterungsattribut id) erstellen. Oder Sie können Erweiterungstabellen pro-Tenant zu schaffen, so dass jeder Mieter sein eigenes Extension-Schema hat.

Wenn Sie eine Multi-Tenant-Datenbank entwerfen, Sie haben in der Regel drei Möglichkeiten:

  1. Haben Sie eine Datenbank pro Mieter
  2. Haben Sie ein Schema pro Mieter
  3. Haben alle Mieter teilen sich die gleiche Tabelle (n)

Die Option, die Sie wählen, hat Auswirkungen auf die Skalierbarkeit, Erweiterbarkeit und Isolation. Diese Auswirkungen wurden in verschiedenen breit diskutiert Fragen Stackoverflow und Datenbank-Artikel.

In der Praxis jeder der drei Gestaltungsmöglichkeiten -mit genug mühe können Fragen rund um Skala Adresse, Daten, die über die Mieter variiert und Isolation. Die Entscheidung hängt von der primären Dimension für Sie bauen. Die Zusammenfassung:

  • Wenn Sie Skala Gebäude sind: Haben alle Mieter den gleichen Tisch zu teilen (e)
  • Wenn Sie für die Isolierung Gebäude sind: Erstellen Sie eine Datenbank pro Mieter

Zum Beispiel Google und Salesforce folgen das erste Muster und haben ihre Mieter die gleichen Tabellen teilen. Stackoverflow auf der anderen Seite folgt das zweite Muster und hält eine Datenbank pro Mieter. Der zweite Ansatz ist auch alltäglich in regulierten Branchen, wie Gesundheitswesen.

Die Entscheidung kommt auf die primäre Dimension sind Sie Ihr Datenbank-Design zu optimieren. diesem Artikel auf die Gestaltung Ihrer SaaS-Datenbank für Skala spricht über den Trade-offs und bietet eine Zusammenfassung im Rahmen von PostgreSQL.

Ein weiterer Punkt ist, dass Sie eine gesetzliche Verpflichtung eines Daten von anothers trennen Unternehmen zu halten haben.

Mit der Regel eine Datenbank pro Client nicht gut skalierbar. MySQL (und wahrscheinlich auch andere Datenbanken) hält Ressourcen offen pro Tisch, das sich nicht gut auf eine Instanz zu 10k + Tabellen eignet, die in einer groß angelegten Multitenancy Situation passieren würde.

Natürlich, wenn Sie ein anderes Problem hat, die anderen Probleme verursacht, bevor Sie auf dieses Niveau zu erhalten, das nicht relevant sein kann.

Darüber hinaus „sharding“ eine Multi-Tenant-Anwendung ist wahrscheinlich € das Richtige sein, schließlich zu tun, wie Ihre Anwendung größer und größer wird.

Sharding bedeutet jedoch nicht, eine Datenbank (oder Instanz) pro Mieter, sondern eine pro Scherbe oder ein Satz von Scherben, die jeweils mehrere Mieter haben kann. Sie müssen die richtigen Tuning-Parameter für sich selbst, wahrscheinlich in der Produktion entdecken (daher wahrscheinlich braucht es ziemlich abstimmbaren von vornherein sein)

€ kann ich nicht garantieren.

Sie können mit einer einzigen Datenbank und partitionieren wie die Anwendung wächst. Wenn Sie dies tun, gibt es ein paar Dinge, die ich empfehlen würde:

1) Entwerfen Sie die Datenbank in einer Weise, dass es leicht aufgetrennt werden kann. Zum Beispiel werden Daten teilen, wenn Kunden, stellen Sie sicher, dass die Daten leicht über jede Datenbank repliziert werden.

2) Wenn Sie nur eine Datenbank haben, stellen Sie sicher, dass es auf einen anderen physischen Server gesichert wird. Im Falle eines Failover Sie Traffic auf diesen anderen Server wiederherstellen können und immer noch Ihre Daten intakt sind.

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