Multi-Tenant PHP SaaS - Separate DBs für jeden Client oder gruppieren Sie diese?

Sie müssen sich hier mit mir abfinden, um möglicherweise einen Teil der Terminologie leicht falsch zu verstehen, da mir nicht einmal bewusst war, dass dies in die gesamte Kategorie "Software als Service für mehrere Mandanten" fällt, aber hier stimmt es.

Ich habe ein Mitgliedersystem (in PHP) für einen Kunden entwickelt. Wir versuchen nun, es als vollständig gehostete Lösung für unsere anderen Kunden anzubieten und eine Subdomain (oder sogar ihre eigene Domain) bereitzustellen.

Die Optionen, die ich hinsichtlich der Datenspeicherung offenbar auf dem Tisch habe, sind:

Option 1 - Speichern Sie alles in einer großen Datenbank, und geben Sie ein Feld 'client_id' in die Tabellen ein, die es benötigen (es gäbe ungefähr 30 Tabellen, für die es gelten würde). In einer Tabelle 'clients' werden die wichtigsten Einstellungen, Details usw und die Domain, die ihnen zugeordnet werden soll. Dies setzt dann nur eine global zugängliche Variable, die ihre individuelle Client-ID enthält - ich müsste natürlich jede einzelne Abfrage ändern, um nach der Spalte client_id zu suchen.

Option 2 - Haben Sie eine Master-Tabelle mit den 'Shared Reference'-Tabellen und der' Clients'-Tabelle. Dann haben "Blöcke" von anderen Datenbanken, die jeweils enthalten, sagen wir 10 Clients. Der Client erhält seine eigenen Datenbanktabellen, denen seine Client-ID vorangestellt ist. Dies erhöht die Sicherheit ein wenig, um zu verhindern, dass andere Kundendaten angezeigt werden, wenn etwas wirklich schief geht.

Option 3 - Genau wie Option 2, mit der Ausnahme, dass Sie für jeden Client eine Datenbank haben, die vollständig von anderen Clients isoliert ist und theoretisch ein bisschen mehr Schutz bietet, als wenn die Tabellen eines Clients gehackt oder anderweitig beschädigt würden, würde dies niemanden betreffen sonst. Der größte Nachteil ist, dass beim Bereitstellen eines neuen Clients eine gesamte Datenbank, ein Benutzer und ein Kennwort eingerichtet werden müssen usw. Könnte dies möglicherweise auch einen erheblichen Mehraufwand verursachen, oder wäre es so ziemlich dasselbe, als hätten Sie alle in einem Datenbank?

Ein paar Punkte auch - einige dieser Kunden werden über 5000 "Kunden" haben, zusammen mit allen Details für diese Kunden - aus diesem Grund ist Option 1 möglicherweise ein kleines Problem - wenn ich 100 Kunden habe, könnte das gleich sein über eine halbe Million Zeilen in einer Tabelle.

Bin ich richtig in der Annahme, dass Option 3 der beste Weg wäre, in einer Situation vorzugehen, in der die Sicherheit von Kundendaten (und Zahlungsinformationen) der Schlüssel ist. Nach den Empfehlungen, die ich erhalten habe, haben einige Leute gesagt, dass sie Option 1 wählen sollen, weil es einfacher ist, aber ich sehe das wirklich nicht so. Ich sehe es als möglichen Engpass auf der ganzen Linie, da ich Kunden sicherlich viel einfacher bewegen kann, wenn sie über eine eigene Datenbank verfügen.

(FYI Das System basiert auf PHP mit MySQL)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage