Multi-tenant PHP SaaS - oddzielne bazy danych dla każdego klienta lub grupować je?

Będziesz musiał się ze mną ponieść, aby ewentualnie nieco pomieszać terminologię, ponieważ nie zdawałem sobie nawet sprawy z tego, że wpadło to w kategorię „oprogramowania jako usługi” „wielu najemców”, ale tutaj tak jest.

Opracowałem system członkostwa (w PHP) dla klienta. Obecnie poszukujemy możliwości oferowania go jako całkowicie hostowanego rozwiązania dla naszych innych klientów, zapewniając subdomenę (lub nawet własną domenę).

Opcje, które wydaje mi się mieć na stole, jeśli chodzi o przechowywanie danych, to:

opcja 1 - Przechowuj wszystko w 1 dużej bazie danych i pole „client_id” na tabelach, które go potrzebują (byłoby tam około 30 tabel, do których miałoby zastosowanie), i posiadaj „tabelę klientów” przechowującą ich główne ustawienia, szczegóły itp. i domena do ich mapowania. Następnie ustawia globalnie dostępną zmienną zawierającą indywidualny identyfikator klienta - musiałbym oczywiście zmodyfikować każde pojedyncze zapytanie, aby sprawdzić kolumnę client_id.

Opcja 2 - Posiadaj tabelę główną z tabelami „współużytkowanych referencji” i tabelą „klientów”. Następnie mają „bloki” innych baz danych, z których każda zawiera, powiedzmy, 10 klientów. Klient otrzyma własne tabele bazy danych, poprzedzone identyfikatorem klienta. Dodaje to trochę bezpieczeństwa, aby zabezpieczyć się przed widzeniem innych danych klienta, jeśli coś poszło nie tak.

Opcja 3 - Dokładnie tak samo jak opcja 2, z wyjątkiem tego, że masz 1 bazę danych dla każdego klienta, całkowicie izolując ich od innych klientów, i teoretycznie zapewniając nieco większą ochronę, że jeśli 1 stoły klienta zostały zhakowane lub w inny sposób uszkodzone, nie wpłynie to na nikogo jeszcze. Największym minusem jest to, że podczas wdrażania nowego klienta trzeba skonfigurować całą bazę danych, użytkownika i hasło itp. Czy może to również spowodować sporą ilość kosztów, czy też byłoby tak samo, jakbyś miał wszystkich w jednym Baza danych?

Kilka punktów - niektórzy z tych klientów będą mieli ponad 5000 „klientów” wraz ze wszystkimi szczegółami dla tych klientów - dlatego opcja 1 może być trochę problematyczna - jeśli mam 100 klientów, może to być równe ponad pół miliona wierszy w jednym stole.

Czy mam rację, że opcja 3 byłaby najlepszym rozwiązaniem w sytuacji, gdy bezpieczeństwo danych klientów (i informacji o płatnościach) jest kluczowe. Z zaleceń, które miałem, kilka osób powiedziało, że wybiorą opcję 1, ponieważ „jej łatwiej”, ale tak naprawdę nie widzę tego w ten sposób. Widzę to jako potencjalne wąskie gardło w linii, ponieważ z pewnością mogę przemieszczać klientów znacznie łatwiej, jeśli mają własną bazę danych.

(FYI System to PHP oparty na MySQL)

questionAnswers(3)

yourAnswerToTheQuestion