Jak zaprojektować bazę danych SaaS

Mam aplikację internetową, którą zbudowałem dla firmy przewozowej, którą chciałbym zaoferować jako SaaS. Jak najlepiej zaprojektować bazę danych?

Czy powinienem utworzyć nową bazę danych dla każdej firmy? A może powinienem użyć jednej bazy danych z tabelami, które mają prefiks nazwy firmy? A może powinienem użyć jednej bazy danych z jedną z każdej tabeli i po prostu dodać pole ID firmy do tabel? A może jest jakiś inny sposób?

Author: givanse, 2010-02-04

5 answers

W obliczu podobnej sytuacji około 10 lat temu zdecydowaliśmy się na bazę danych dla każdego klienta. mamy setki (Nie tysiące) klientów. patrząc wstecz, to była jedna z najlepszych decyzji, jakie podjęliśmy. kopie zapasowe są łatwe. kopiowanie pojedynczego klienta do Naszego Biura do analizy jest łatwe (wystarczy wykonać ostatnią kopię zapasową). skalowanie jest łatwe(przeniesienie jednego dużego klienta na inny serwer może zwolnić zasoby na obciążonym serwerze sql). joel i jeff dyskutowali o tym na stack overflow podcast (nie niedawno) i joel zrobił to samo co ja ... każdy klient otrzymuje własną bazę danych. puryści baz danych często argumentują za wrzucaniem wszystkich do jednego db, ale nigdy bym tego nie zrobił.

-don

 25
Author: Don Dickinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 07:44:22

Czy powinienem utworzyć nową bazę danych dla każdej firmy?

Tak-Don Dickinson był na forsie. Zobacz jednak udoskonalenie poniżej.

Czy powinienem użyć jednej bazy danych z tabelami, które mają przedrostek Nazwa firmy?

Panie nie! Zmiana zapytań do bazy danych dla różnych dla klienta sprawi, że oszalejesz! Ponadto prawie na pewno uruchomisz dynamiczny SQL (gdzie nazwa tabeli jest zmieniana w kodzie przed uruchomieniem zapytania), co zaszkodzi wydajność ponieważ większość serwerów lubi buforować plany zapytań i wyniki tymczasowe - nie działa to, jeśli nazwy tabel się zmieniają.

Czy powinienem użyć jednej bazy danych z jednym każdej tabeli i wystarczy dodać firmę pole id do tabel?

Możesz to zrobić, jeśli chcesz mieć jakiś skalowalny model dla swoich klientów. Utworzenie nowej bazy danych dla każdego klienta zapewnia dużą elastyczność, ale wiąże się również z kosztami i złożonością. Musisz utwórz nowy harmonogram tworzenia kopii zapasowych, miej model cyklu życia dla obsługi wygasłych klientów itp.

Można więc powiedzieć, że klienci" free trial "i" bronze "są umieszczani w jednej bazie danych, używając identyfikatora firmy, aby je rozdzielić; użytkownicy" silver "otrzymują własną bazę danych (ale nadal trzymasz pole customer_id w schemacie, więc nie musisz zmieniać zapytań między dwoma poziomami klienta), a klienci" gold " otrzymują własny serwer bazy danych.

I did something similar a kilka lat temu w firmie SaaS - a klienci są zazwyczaj szczęśliwi, że mają ścieżkę modernizacji infrastruktury (Czytaj: wydajność i odporność), a także funkcje.

 9
Author: Neville Kuyt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-18 15:57:51
 4
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:34

Mamy tutaj kilka baz danych ze współdzielonymi klientami, a niektóre, gdzie każdy klient ma własny serwer i własną bazę danych. Te, w których klient znajduje się na własnym serwerze, są najłatwiejsze do zarządzania i najmniej prawdopodobne, że spowodują problem, gdy jakiś programista zapomniał dodać clientid i wysłał dane Klienta a do klienta b przypadkowo (przykład nie wybrany losowo).

Utrzymanie każdej z nich na własnym serwerze lub instancji serwera pozwala nam zachować tę samą strukturę bazy danych o tych samych nazwach i ułatwia rozprzestrzenianie zmian na wszystkich serwerach, ponieważ nie musimy zmieniać nazwy bazy danych.

Jeśli używasz osobnych instancji dla każdego klienta, upewnij się, że zaprojektowałeś i zaimplementowałeś dobry system do propagowania wszystkich zmian dla wszystkich klientów. Jeśli te bazy danych się zsynchronizują, mogą stać się straszne do utrzymania. Przekonasz się, że jeśli pozwolisz im się zsynchronizować, każdy klient poprosi o zmiany i będziesz miał 27 sposobów, aby zrobić to samo. Trzeba uogólnić, gdy są one w tej samej bazie danych, gdy są oddzielne, musisz użyć samodyscypliny, aby zapewnić, że nowa funkcjonalność jest taka sama dla każdego klienta.

 2
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-12 20:41:57

To zależy, tutaj pracuję w firmie, która ma wiele "wewnętrznych jednostek biznesowych" traktowanych jak inne firmy. Tak więc niektóre raporty muszą obejmować wszystkie firmy, konta klientów muszą być również dzielone między firmy. Tutaj mamy pole CompanyId w tabelach, które tego wymaga. Rozwiązanie prefiksu z pewnością należy unikać.

 1
Author: Burnsys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-04 18:47:59