Jedna duża baza danych vs wiele małych baz danych - wydajność

0

Cześć,
Chcę napisać aplikację, która będzie przeznaczona dla wielu firm. Każda firma będzie miała dostęp do swoich danych.
Mam pytanie co powinno być wydajniejsze:

  1. Stworzenie jednej dużej bazy danych i w każdej tabeli dodać kolumnę z index-em dla Id firmy
  2. Stworzyć jedną bazę konfiguracyjną + bazę danych dla każdej firmy, która będzie korzystać z aplikacji. Dodanie nowej firmy wymagać będzie stworzenia nowej bazy danych.

Jedna baza byłaby na pewno łatwiejsza do ogarnięcia, natomiast wyodrębnienie każdej firmy przez stworzenie niezależnych baz danych też ma swoje dodatkowe atuty.
Obecnie moje pytanie dotyczy jedynie wydajności - czy rozbicie danych na wiele baz powinno poprawić wydajność czy wręcz przeciwnie?

Nie wiem czy to ma znaczenie, ale mowa o aplikacji webowej korzystającej z PostgreSql lub MySql.
Z góry dziękuję za pomoc.

0

Czy w podejściu 1 baza = 1 firma byłaby 1 bazka per server? czy wszystkie na 1? zgaduje że to 2?

2
Kofcio napisał(a):

Jedna baza byłaby na pewno łatwiejsza do ogarnięcia

Może pod względem administracyjnym (np. wystarczy jeden drop aby naprawić problemy wydajnościowe), ale nie programistycznym.

Obecnie moje pytanie dotyczy jedynie wydajności - czy rozbicie danych na wiele baz powinno poprawić wydajność czy wręcz przeciwnie?

Ile milionów użytkowników zakładasz?

0
1a2b3c4d5e napisał(a):

Czy w podejściu 1 baza = 1 firma byłaby 1 bazka per server? czy wszystkie na 1? zgaduje że to 2?

Raczej każda baza byłaby na tym samym serwerze (chyba, że będzie duże zainteresowanie :P - to można będzie podzielić na kilka serwerów :P)

somekind napisał(a):
Kofcio napisał(a):

Jedna baza byłaby na pewno łatwiejsza do ogarnięcia

Może pod względem administracyjnym (np. wystarczy jeden drop aby naprawić problemy wydajnościowe), ale nie programistycznym.

Obecnie moje pytanie dotyczy jedynie wydajności - czy rozbicie danych na wiele baz powinno poprawić wydajność czy wręcz przeciwnie?

Ile milionów użytkowników zakładasz?

Ad 1) słuszna uwaga z tym drop-em ;)
Ad 2) jestem ambitny, ale na początek załóżmy skromne 1000 użytkowników :)

Tak swoją drogą pierwsza uwaga sugeruje model wielobazodanowy a druga uwaga raczej jednobazodanowy :).

5
Kofcio napisał(a):

Cześć,
Chcę napisać aplikację, która będzie przeznaczona dla wielu firm. Każda firma będzie miała dostęp do swoich danych.
Mam pytanie co powinno być wydajniejsze:

  1. Stworzenie jednej dużej bazy danych i w każdej tabeli dodać kolumnę z index-em dla Id firmy

kompletny kretynizm, jeżeli już taką głupotę jak jedną bazę chciałbyś zrobić to przedrostki do nazw tabel
FRIMA1_TABELA1
zamiast jakichś dodatkowych pól w tabeli

  1. Stworzyć jedną bazę konfiguracyjną + bazę danych dla każdej firmy, która będzie korzystać z aplikacji. Dodanie nowej firmy wymagać będzie stworzenia nowej bazy danych.

dlaczego jedną konfiguracyjną i co w niej będzie?

Jedna baza byłaby na pewno łatwiejsza do ogarnięcia, natomiast wyodrębnienie każdej firmy przez stworzenie niezależnych baz danych też ma swoje dodatkowe atuty.

trudniejsza by była

Obecnie moje pytanie dotyczy jedynie wydajności - czy rozbicie danych na wiele baz powinno poprawić wydajność czy wręcz przeciwnie?

na pewno poprawi szukanie przyczyn błedów, wydajność pewnie też

Nie wiem czy to ma znaczenie, ale mowa o aplikacji webowej korzystającej z PostgreSql lub MySql.
Z góry dziękuję za pomoc.

0
Miang napisał(a):
Kofcio napisał(a):

Cześć,
Chcę napisać aplikację, która będzie przeznaczona dla wielu firm. Każda firma będzie miała dostęp do swoich danych.
Mam pytanie co powinno być wydajniejsze:

  1. Stworzenie jednej dużej bazy danych i w każdej tabeli dodać kolumnę z index-em dla Id firmy

kompletny kretynizm, jeżeli już taką głupotę jak jedną bazę chciałbyś zrobić to przedrostki do nazw tabel
FRIMA1_TABELA1
zamiast jakichś dodatkowych pól w tabeli

  1. Stworzyć jedną bazę konfiguracyjną + bazę danych dla każdej firmy, która będzie korzystać z aplikacji. Dodanie nowej firmy wymagać będzie stworzenia nowej bazy danych.

dlaczego jedną konfiguracyjną i co w niej będzie?

Jedna baza byłaby na pewno łatwiejsza do ogarnięcia, natomiast wyodrębnienie każdej firmy przez stworzenie niezależnych baz danych też ma swoje dodatkowe atuty.

trudniejsza by była

Obecnie moje pytanie dotyczy jedynie wydajności - czy rozbicie danych na wiele baz powinno poprawić wydajność czy wręcz przeciwnie?

na pewno poprawi szukanie przyczyn błedów, wydajność pewnie też

Nie wiem czy to ma znaczenie, ale mowa o aplikacji webowej korzystającej z PostgreSql lub MySql.
Z góry dziękuję za pomoc.

Baza konfiguracyjna będzie przechowywać informację o użytkownikach, firmach (w tym nazwach baz danych w których będą one przechowywane - zakładając rozwiązanie z wieloma bazami), jakieś wspólne dane (np. kursy walut) itp.

Pozostałe bazy byłyby identyczne (te same tabele itp.) i dla każdej firmy byłaby tworzona niezależna baza.
Zaleta tego rozwiązania jest taka, że mam rozdzielone wszystkie dane (mniejsze ryzyko, że dane mi wyciekną z jednej firmy do drugiej). Dodatkowo tabele będą mniejsze.
Gdy firma zrezygnuje z usługi to robimy kopię takiej bazy i ją usuwamy z serwera głównego.
Z drugiej strony każda modyfikacja struktury bazy danych wymagać będzie update'u wszystkich baz danych...

Opcja z jedną bazą danych jest o tyle łatwiejsza, że każda modyfikacja bazy jest jednorazowa (odbywa się na jednej bazie a nie na N bazach).
Koncepcja z tworzeniem oddzielnych tabel dla każdej firmy bardzo mi się nie podoba - jeżeli zdecydowałbym się na jedną bazę danych to wszystkie dane będą w jednej tabeli i tak jak pisałem wcześniej będzie kolumna z ID firmy, której dotyczy wpis. W konsekwencji tabela będzie zawierać dane wszystkich firm (będzie znacznie większa).

Jeszcze nie wiem ile będzie tabel w bazie, ale myślę, że około 100.

Koncepcja jest ogólnie taka, że każdy użytkownik w danej chwili może być zalogowany do jednej firmy (wyświetlane dane będą pochodziły z jednej bazy lub z tabeli o określonym ID_Firmy) i raczej nie będzie od tego wyjątków.

4
Kofcio napisał(a):

Chcę napisać aplikację, która będzie przeznaczona dla wielu firm. Każda firma będzie miała dostęp do swoich danych.

A co jeśli jakaś firma będzie chciała wziąć swoje dane i produkt od ciebie i hostować go sobie samemu on-premise (o ile twoja licencja / model biznesowy na to pozwoli)? Czy wtedy nie lepiej, że już na wstępie byłoby to jakoś oddzielone?

Mam pytanie co powinno być wydajniejsze:
(...) Chcę napisać aplikację, która będzie przeznaczona dla wielu firm.

Ad 2) jestem ambitny, ale na początek załóżmy skromne 1000 użytkowników :)

Jestem ciekaw, czy to nie jest przypadek z serii "rozwiązuję problemy, których nie mam, w nadziei na wielki sukces".

Jedna baza byłaby na pewno łatwiejsza do ogarnięcia

Czemu uważasz, że jedna wspólna baza byłaby łatwiejsza do ogarnięcia?

Raczej każda baza byłaby na tym samym serwerze (chyba, że będzie duże zainteresowanie :P - to można będzie podzielić na kilka serwerów :P)

Czy rozważasz technologie chmurowe i kontenerowe, które mogłyby ułatwić późniejsze "dzielenie na kilka serwerów"?

Z drugiej strony każda modyfikacja struktury bazy danych wymagać będzie update'u wszystkich baz danych...

Ale czy trzeba to robić ręcznie? Czy nie można tego zautomatyzować?

0
LukeJL napisał(a):
Kofcio napisał(a):

Chcę napisać aplikację, która będzie przeznaczona dla wielu firm. Każda firma będzie miała dostęp do swoich danych.

A co jeśli jakaś firma będzie chciała wziąć swoje dane i produkt od ciebie i hostować go sobie samemu on-premise (o ile twoja licencja / model biznesowy na to pozwoli)? Czy wtedy nie lepiej, że już na wstępie byłoby to jakoś oddzielone?

Ogólnie tego nie zakładałem - to ma być aplikacja webowa, ale fakt warto to rozważyć :)

Mam pytanie co powinno być wydajniejsze:
(...) Chcę napisać aplikację, która będzie przeznaczona dla wielu firm.

Ad 2) jestem ambitny, ale na początek załóżmy skromne 1000 użytkowników :)

Jestem ciekaw, czy to nie jest przypadek z serii "rozwiązuję problemy, których nie mam, w nadziei na wielki sukces".

Zdecydowanie tak właśnie jest :). Ale chyba lepiej zrobić od razu coś dobrze, niż później refaktoryzacja całego rozwiązania. Ja szukam tylko za i przeciw a co z tego wyjdzie to czas pokaże :).

Jedna baza byłaby na pewno łatwiejsza do ogarnięcia

Czemu uważasz, że jedna wspólna baza byłaby łatwiejsza do ogarnięcia?

Takie mam wrażenie, ale faktycznie może się mylę. Różnica jest m.in. taka, że w jednym rozwiązaniu dodaję do klauzuli WHERE warunek typu ID_Firma = x versus przy każdym zapytaniu łączę się z daną bazą danych (w sensie API weryfikuje do której firmy zalogowany jest user i w zależności od tego łączy się z daną bazą).

Raczej każda baza byłaby na tym samym serwerze (chyba, że będzie duże zainteresowanie :P - to można będzie podzielić na kilka serwerów :P)

Czy rozważasz technologie chmurowe i kontenerowe, które mogłyby ułatwić późniejsze "dzielenie na kilka serwerów"?

Nie, chmury w ogóle nie biorę pod uwagę. W przypadku, gdy każda firma byłaby oddzielną bazą danych to podział na kilka serwerów nie wydaje się zbyt skomplikowany (nie to, że nie będzie z tym żadnych problemów, ale wydaje mi się, że to ogarnę).

Z drugiej strony każda modyfikacja struktury bazy danych wymagać będzie update'u wszystkich baz danych...

Ale czy trzeba to robić ręcznie? Czy nie można tego zautomatyzować?

Słusznie, nie trzeba :).

Tak ogólnie to rozwiązanie z oddzielną bazą dla każdej firmy od początku bardziej mi się podobało, ale wolałem to jeszcze skonsultować :).

8

@Kofcio:

Zagadnienie nie jest na bezludnej wyspie, i branża to nazywa multitenant

Rozważa się ok trzech implementacji, zacznij czytanie stąd (nie zrażaj się, ze o Javie)
https://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_multitenant.htm

Przy czym branża rozważa, i żadnego radykalnie nie odrzuca.

Miang napisał(a):

jeżeli już taką głupotę jak jedną bazę chciałbyś zrobić to przedrostki do nazw tabel
FRIMA1_TABELA1
zamiast jakichś dodatkowych pól w tabeli

Jeden z gorszych pomysłów. Np raporty z designera raportów idą się je...ć

Kofcio napisał(a):

Tak ogólnie to rozwiązanie z oddzielną bazą dla każdej firmy od początku bardziej mi się podobało, ale wolałem to jeszcze skonsultować :).

Jest generalnie lepszą, za wyjątkami: pól miliona użytkowników a bazy małe fizycznie i logicznie (jakaś wizytówka / karteczka z zakupami itd), dziwny cennik za sztukę bazy na hostingu (ilośc baz * 25 USD), sztywny limit baz danych np 1000 (bywa, ze względu na rozmiar katalogu)

Kofcio napisał(a):

Obecnie moje pytanie dotyczy jedynie wydajności - czy rozbicie danych na wiele baz powinno poprawić wydajność czy wręcz przeciwnie?

Jeśli są rzadko używane, to baza śpiącego od dawna klienta jest wymieciona z cache, pierwsze użycie po obudzeniu się jest wolne - w jednej bazie to inni klienci zapewniają aktywność cache.
ALE PRZECIWNIE: jeśli inny bardzo wielki klient nabił gigabajtów do bazy, to na pewno to spowalnia, jak sam jesteś maluchem

Więc odp No 1: to zależy

4

Dorzucę swoje 3 grosze.
(Moja wiedza na temat MySQL jest sprzed ~6-7 lat więc możliwe, że dużo się zmieniło).
Rozumiem, że zakładasz wielu użytkowników, a cały proces ma być bezpieczny i skalowany.

1.MySQL - moja stara wiedza sugeruje, że nie da się wykonać założeń bez tworzenia osobnych baz danych.
Jeśli zdecydujesz się na jedną bazę danych, to jeśli nic się nie zmieniło w tej kwestii, to nie jest możliwe bezpieczne odseparowanie danych.

2.PostgreSQL - jeden klaster , jedna baza danych, wielu użytkowników do bazy danych, dla każdego użytkownika osobny namespace.
Będziesz miał jedną, bezpieczną bazę danych, wielu użytkowników. Prostota obsługi, możliwość separacji / wydzielania.

6

Tak naprawdę to na złym poziomie podchodzisz do tematu. Ja bym zaczął od aspektów prawnych czy możesz te dane trzymać w jednej bazie dla wielu firm. Czy zakładasz możliwość migracji firmy na instalację wydzieloną? Ile danych może mieć taka firma? Ogólnie temat jest znany i jak poszukasz o doborze modelu pod aplikacje saas to w internecie jest tego sporo.

ZrobieDobrze napisał(a):

ALE PRZECIWNIE: jeśli inny bardzo wielki klient nabił gigabajtów do bazy, to na pewno to spowalnia, jak sam jesteś maluchem

Dlatego warto zastosować rozwiązanie hybrydowe. Małe żuczki na jednej dużej bazie a takie naprawdę duże klienty na osobnych instalacjach.

9

Obecnie moje pytanie dotyczy jedynie wydajności

A to niedobrze, bo wydajność raczej jest tutaj drugorzędna. Nie będziesz obsługiwać milionów requestów na minutę, ani baza nie osiągnie rozmiaru 432TB w ciągu miesiąca, więc nie tym powinieneś się przejmować.

Ja widzę wiele plusów rozbicia tego na osobną bazę dla każdej firmy:

  • mniejsze ryzyko, że coś pójdzie błędnego w zapytaniu i dane się pomieszają - np. pokaże produkty innej firmy, albo kasując coś, wywalisz dane sąsiada. Tutaj - jak będzie jakiś fakap, to jedynie w obrębie jednej firmy
  • możesz, bez kombinowania, zrobić zrzut tylko jednej firmy (w celu backupu albo przekazania klientowi). Oczywiście - w przypadku jednej wspólnej, możesz też zrobić SELECT WHERE firma_ID=324, ale taka baza będzie niespójna, będą luki w numeracji, może brakować jakichś dokumentów czy odwołań
  • bezpieczeństwo (RODO): tutaj dane poszczególnych firm masz fizycznie odseparowane, więc w razie jakiegoś wycieku, jeśli wycieknie jedna baza, to tylko dane jednej firmy, a nie wszystko. Plus w zasadach przetwarzania danych to zdecydowanie lepiej wygląda zapis w stylu "baza danych każdego podmiotu jest odseparowana od pozostałych baz". Albo - jak firma zakończy współpracę i będziesz zmuszony pozbyć się ich danych osobowych - prościej jest zaorać bazę, niż kasować wszystkie wpisy dotyczące jakiegoś firma_ID, ryzykując tym kasowaniem naruszenie spójności danych (w końcu - przy jednej dużej bazie, masz wszystkie dane w jednym wielkim worku)
  • skalowanie: jak masz osobne bazy i zacznie się kończyć miejsce/problem z wydajnością, to po prostu przerzucasz część baz na nowy serwer i jedynie w ustawieniach konkretnego usera zmieniasz namiary na serwer SQL

OK, zarządzanie dziesiątkami/setkami baz jest (w mojej ocenie) trudniejsze, niż jedną - chociażby jakiekolwiek zmiany struktury, czyszczenie starych wpisów itp. musisz robić osobno dla każdej bazy, ale to da się zautomatyzować/oskryptować. Tak samo jak proces tworzenia nowej bazy - musi to być z automatu w momencie tworzenia konta przez klienta. Ale to są pewne niedogodności, które są 100x mniejsze, niż potencjalny zysk. I nie pchałbym się w MySQL, tylko Postgresa. MySQL (czy jakaś Maria) jest OK, ale tutaj masz trochę bardziej rozbudowaną wizję, więc ja bym zdecydowanie szedł w Postgresa.

1
cerrato napisał(a):

Obecnie moje pytanie dotyczy jedynie wydajności

A to niedobrze, bo wydajność raczej jest tutaj drugorzędna. Nie będziesz obsługiwać milionów requestów na minutę, ani baza nie osiągnie rozmiaru 432TB w ciągu miesiąca, więc nie tym powinieneś się przejmować.

Ja widzę wiele plusów rozbicia tego na osobną bazę dla każdej firmy:

  • mniejsze ryzyko, że coś pójdzie błędnego w zapytaniu i dane się pomieszają - np. pokaże produkty innej firmy, albo kasując coś, wywalisz dane sąsiada. Tutaj - jak będzie jakiś fakap, to jedynie w obrębie jednej firmy

Takie samo ryzyko, że wybierze złą bazę itp itd.

  • możesz, bez kombinowania, zrobić zrzut tylko jednej firmy. Oczywiście - w przypadku jednej wspólnej, możesz też zrobić SELECT WHERE firma_ID=324, ale taka baza będzie niespójna, będą luki w numeracji, może brakować jakichś dokumentów czy odwołań

To chyba jedyny plus, że można łatwo klienta wyemigrować na osobną instalację przenieść na inny serwer.

  • bezpieczeństwo (RODO): tutaj dane poszczególnych firm masz fizycznie odseparowane, więc w razie jakiegoś wycieku, jak wycieknie jedna baza, to tylko dane jednej firmy, a nie wszystko. Plus w zasadach przetwarzania danych to zdecydowanie lepiej wygląda zapis w stylu "baza danych każdego podmiotu jest odseparowana od pozostałych baz"

RODO to tylko i wyłącznie zapisy i procedury i tak naprawdę, jak nie handlujesz danymi klientów to jak masz HTTPs hasła szyfrowane to już jesteś kryty.

  • skalowanie: jak masz osobne bazy i zacznie się kończyć miejsce/problem z wydajnością, to po prostu przerzucasz część baz na nowy serwer i jedynie w ustawieniach konkretnego usera zmieniasz namiary na serwer z SQL

No chyba, że się pomylisz.

OK, zarządzanie dziesiątkami/setkami baz jest (w mojej ocenie) trudniejsze, niż jedną - chociażby jakiekolwiek zmiany struktury, czyszczenie starych wpisów itp. musisz robić osobno dla każdej bazy, ale to da się zautomatyzować/oskryptować. Tak samo jak proces tworzenia nowej bazy - musi to być z automatu w momencie tworzenia konta przez klienta. Ale to są pewne niedogodności, które są 100x mniejsze, niż potencjalny zysk. I nie pchałbym się w MySQL, tylko Postgresa. MySQL (czy jakaś Maria) jest OK, ale tutaj masz trochę bardziej rozbudowaną wizję, więc ja bym zdecydowanie szedł w Postgresa.

Koszty utrzymania dużej ilości małych baz mogą zjeść sensowność projektu.

4

Takie samo ryzyko, że wybierze złą bazę itp itd.

No to tylko na początku - podczas logowania/tworzenia sesji/cokolwiek pobierasz kredki do konkretnej bazy - więc zgadzam się, tutaj możesz dostać złe dane, ale jak to już przejdzie to nie ma opcji pomieszania danych. A jak dostaniesz złe dane to od razu widać, że coś nie działa, masz inne dane, klient natychmiast zgłosi, że nie może pracować/widzi dziwne rzeczy. Co innego jak powstanie mix np. moich tematów i "pożyczonych" - stwierdzenie tego faktu może zając więcej czasu

RODO to tylko i wyłącznie zapisy i procedury

Nie do końca, masz m.in. takie hasła jak privacy by design oraz privacy by default. I taka separacja baz klientów się idealnie w to wpisuje. Ma to znaczenie dwojakie: niektóre firmy na to zwracają uwagę i może dla nich mieć to znaczenie, a po drugie - w razie przypału, im masz więcej dupochronów, tym łatwiej się wykręcić albo otrzymasz niższą karę.

No chyba, że się pomylisz.

Ten argument pasuje do dowolnego scenariusza, więc w sumie - nic nie wnosi

Koszty utrzymania dużej ilości małych baz mogą zjeść sensowność projektu.

Jeśli będziesz na nich operować ręcznie to zgadzam się. Jeśli masz to zautomatyzowane/oskrypotowane to już niekoniecznie. Pytanie jeszcze - czy bierzesz jakieś gotowe rozwiązanie i tam masz jakieś limity/opłaty za każdą bazę, czy masz to na swoim serwerze. Jak masz swój (VPS czy cokolwiek innego) to takie limity Cię nie dotyczą i możesz sobie założyć kilkaset baz bez problemów. A jak będą ich tysiące, to znaczy, że projekt się rozrósł na tyle, żeby go przepisać od nowa w profesjonalny sposób, a do tego - będziesz wtedy miał budżet na wdrożenie tego w sposób bezkompromisowy.

2

Proponował już ktoś rozwiązanie pośrednie, tzn jeden schemat pod firmę? Ja w tej chwili tak mam - jeden schemat pod jednego klienta. Co sądzicie o taki podejściu?

1

Dziękuję bardzo wszystkim za udział w dyskusji. Na pewno wiele zależy od danego projektu, ale utwierdziliście mnie w przekonaniu, że w moim przypadku oddzielna baza na każdego klienta to najlepsze rozwiązanie.

6

Ależ szybkie wnioski. A co z upgrade aplikacji, który wymaga jakichś zmian w bazie (na początku zapewne dość częsta sytuacja)? Będziesz wyłączał dostęp wszystkim na raz i aktualizował metodą "wszystko albo nic"? Jeśli masz jedno miejsce, gdzie jest zainstalowana sama aplikacja i nie przewidujesz równoczesnego działania różnych wersji, to każda z baz musi pasować do tej aplikacji. Co oznacza, że każdy upgrade odcina wszystkich klientów. Im więcej klientów tym większy problem (i dłużej to trwa).

Jaki masz pomysł na przechowywanie konfiguracji tej aplikacji, tj. czy każdy klient ma mieć identyczną? Np. czy może sobie zdefiniować oddzielne wzorce numeracji faktur czy system narzuca mu jedyny słuszny? Albo czy może sobie wybrać jakie rodzaje dokumentów magazynowych chce obsługiwać? A może nie ma mieć żadnego wyboru i każdy ma dostęp do wszystkiego?

Gdzie będzie mechanizm pilnujący ciągłości numeracji faktur (rzecz krytyczna w tego typu systemie)?

No i na koniec - a co z instancją testową systemu, czy każdy klient będzie miał swoją? Jak zapanujesz nad znaczącą ilością takich baz?

1

Albo co jeżeli jednemu klientowi płacącemu dużo $$$ wywali się jakiś automat po update i będzie chciał reverta do starej wersji na jakiś czas bo fabryka stoi :D

1
1a2b3c4d5e napisał(a):

Albo co jeżeli jednemu klientowi płacącemu dużo $$$ wywali się jakiś automat po update i będzie chciał reverta do starej wersji na jakiś czas bo fabryka stoi :D

W drugi wątku kolega zdradza zamysł.

To rzeczywiście obszar o bardzo dużej złożoności (a jak na było nie było dla firmy nie mającej np zawodowego technologa czy doświadczonego analityka d/s obiegu dokumentów - o ogromnej), i zagrożenie nieudanymi upgradami jest znaczne. Nie sposób w wielkim pakiecie biznesowym dobrze przetestować wszystkich ścieżek, gdy ścieżki odmiennie działają u różnych klientów

To jest jego problem. Nie dajesz dostępu do bazy w takich aplikacjach — S4t 11 minut temu

Jego problem PRZED kupieniem. Coś się zdaje, że rachunki multitenacy są przesadzone przynajmniej o dwa zera

(co wyjaśnia drugi wątek kolegi PostgreSQL vs MySQL - jakie są wasze doświadczenia)

0
robertos7778 napisał(a):

Ależ szybkie wnioski. A co z upgrade aplikacji, który wymaga jakichś zmian w bazie (na początku zapewne dość częsta sytuacja)? Będziesz wyłączał dostęp wszystkim na raz i aktualizował metodą "wszystko albo nic"? Jeśli masz jedno miejsce, gdzie jest zainstalowana sama aplikacja i nie przewidujesz równoczesnego działania różnych wersji, to każda z baz musi pasować do tej aplikacji. Co oznacza, że każdy upgrade odcina wszystkich klientów. Im więcej klientów tym większy problem (i dłużej to trwa).

W pewnym zakresie można rozwiązać problem różnych wersji baz danych, ale fakt, że raczej poszedłbym w kierunku updateów w weekendy po północy i starałbym się to maksymalnie zautomatyzować. Raczej nie powinien to być istotny problem.

Jaki masz pomysł na przechowywanie konfiguracji tej aplikacji, tj. czy każdy klient ma mieć identyczną? Np. czy może sobie zdefiniować oddzielne wzorce numeracji faktur czy system narzuca mu jedyny słuszny? Albo czy może sobie wybrać jakie rodzaje dokumentów magazynowych chce obsługiwać? A może nie ma mieć żadnego wyboru i każdy ma dostęp do wszystkiego?

Odnośnie numeracji to różne rozwiązania stosuje się na rynku, ale zakładam pewien kompromis - do pewnego stopnia będzie to konfigurowalne.
Odnośnie dokumentów magazynowych to nie do końca rozumiem o co pytasz, ale magazyny mają określone typy dokumentów. Więc jeśli pytasz czy użytkownik będzie mógł stworzyć swój własny typ to raczej tego nie przewiduję. Ale jeśli pytasz czy użytkownik będzie mógł wystawić dokument PZ, PW, MM, RW, WZ itp. to tutaj w zasadzie ma dowolność. Oczywiście musi być również kontrola stanu magazynu (brak możliwości wystawienia WZ towaru, którego nie ma na magazynie itp.).

Gdzie będzie mechanizm pilnujący ciągłości numeracji faktur (rzecz krytyczna w tego typu systemie)?

Ciągłość numeracji nie jest "krytyczna" w tego typu systemach i nie powinna być narzucona, ale fakt, że powinna być wspierana. Tzn. System powinien sugerować następny numer (ostatni + 1), ale user powinien móc go zmienić. Oczywiście gdy system ma nadać kolejny numer to powinien być on określany przy zapisywaniu faktury do bazy.

No i na koniec - a co z instancją testową systemu, czy każdy klient będzie miał swoją? Jak zapanujesz nad znaczącą ilością takich baz?

Nie jestem pewny o co pytasz, ale na pewno przewiduję udostępnić testową wersję aplikacji, gdzie każdy będzie mógł ją przetestować. Baza będzie raczej jedna i wszystkie operacje mogą być na niej wykonywane w pamięci (user niczego na sztywno nie usunie ani nie utworzy).
Dodatkowo każdy będzie mógł założyć sobie konto, ale dostęp do firm i pewnych funkcjonalności będzie już licencjonowana.

3

Ja u siebie korzystam z jednej bazy na wiele firm. Sporo na ten temat rozmyślałem i wyszło mi że najlepiej mieć to w jednej bazie.

Tylko, że mój produkt to nie jest aplikacja, do której dokładam firmy, tylko każda z nich ma bazę u siebie. Potrzeba obsługi kilku podmiotów wynika z tego, że np klient zmienia osobowość prawną, lub mamy biuro rachunkowe, które obsługuje kilka podmiotów..cz jakiś zarządców co obsługują kilka podmiotów.
Nie mam statystyk, ale mam instalacje, że jedna baza obsługuje ok 200 podmiotów.

Rozważ czego potrzebujesz, miał sytuację, że klient z biura rachunkowego kupował mój program i nie miałem problemu z odseparowaniem danych i instalacji na nich kolejnej instancji programu.

Zaznaczę że moje rozwiązanie sprawdza się u mnie, co nie znaczy że sprawdzi się u ciebie.

4

Jak zwykle zależy. Większość argumentów za i przeciw już została wymieniona w postach powyżej.
Każde rozwiązanie ma swoje wady i zalety ale zalet dla rozwiązania z jedną bazą jest dużo mniej.
O ile mamy łatwy system np. jakiś CMS / prosty sklep, w którym dodanie do każdej tabeli idFirmy może wydawać się strzałem w dziesiątkę to po pewnym czasie ten strzał może okazać się strzałem w kolano.
Mogą pojawić się problemy wydajnościowe, bezpieczeństwa danych, problemy z dostosowywaniem systemu do indywidualnych potrzeb.

Rozwiązanie z wieloma bazami np. jednej jest ogólniejsze i bezpieczniejsze ale wymaga wkładu większej pracy w zakresach:

  • projektowania,
  • stworzenia odpowiednich skryptów aktualizujących poszczególne instancje baz danych ;
  • stworzenia odpowiednich skryptów aktualizujących poszczególne instancje aplikacji pracujących z tymi bazami ;

(Oczywiście mamy na myśli wiele osobnych serwerów bazodanowych lub wiele "schema" w ramach jednego serwera.)

Zalety są też takie, że wciąż można mieć jedną instancję aplikacji, która po zalogowaniu łączy się z wybraną bazą ale można także postawić wiele instancji tej aplikacji...

Zatem wiele baz jest rozwiązaniem:

  • o wiele bardziej elastycznym ;
  • bezpieczniejszym ;
  • ale nieco trudniejszym w ogarnięciu na etapie planowania i projektowania.

Przy dzisiejszych możliwościach serwerów automatyczne postawienie nowej instancji bazy to dziecinnie prosta rzecz. Wiedząc to pchanie się w jeną bazę i rozdzielanie klientów po jakimś tam idCustomer w każdej tabeli to rozwiązanie głupie i założenia gorsze od wielu baz.
Nawet jeśli w będziesz miał tylko 3 klientów to zawsze istnieje ryzyko, że jeden będzie miał 20 milionów rekordów a pozostali w sumie tylko 100. Jak w takiej sytuacji będziesz kalkulował koszty serwera dla tych małych klientów jeśli z powodu tylko tego jednego gościa będziesz potrzebował serwer na za 1000zł/miesiąc?

3

Albo co jeżeli jednemu klientowi płacącemu dużo $$$ wywali się jakiś automat po update i będzie chciał reverta do starej wersji na jakiś czas bo fabryka stoi

No to jest kolejny argument na rzecz stosowania osobnych baz dla każdego klienta. Bo w opisanej przez Ciebie sytuacji, jak musisz zrobić osobną wersję dla wybranego klienta, stawiasz nową wirtualkę/dockera/VPS/komputer pod biurkiem, na nim stawiasz serwer WWW+PHP (albo cokolwiek innego) i bazę tylko dla tego klienta. I to jest do ogarnięcia w godzinę. A jak sobie wyobrażasz wspólną bazę, na której pracują różne wersje apki? Bo ja tego za bardzo nie widzę przy jednej wielkiej bazie dla wszystkich, za to rozbicie na baza per firma/klient daje o wiele większą elastyczność (kosztem większej pracy związanej z ogarnięciem grupy osobnych baz)

poszedłbym w kierunku updateów w weekendy po północy

Czyli ograniczasz się do polskich klientów - tak? Bo nasza północ to w innych miejscach jest środek dnia roboczego :P

Ciągłość numeracji nie jest "krytyczna" w tego typu systemach

No tutaj mam inne znaczenie. Może masz wiedzę programistyczną, ale widzę, że tak zwana wiedza domenowa trochę u Ciebie kuleje. Ciągłość numeracji faktur jest czymś kluczowym, w razie kontroli, gdy US zauważy, że numeracja jest z czapy, będzie się bardzo cieszył :D Pierwszy z brzegu cytat z Google odnośnie ciągłości numeracji - Podstawowym przepisem prawa regulującym kwestię numeracji faktur jest art. 106e ust. 1 pkt 2 ustawy o VAT, który podaje, że faktura powinna zawierać kolejny numer nadany w ramach jednej lub więcej serii, który w sposób jednoznaczny identyfikuje fakturę.. OK, powinna być możliwość ręcznej ingerencji w numerację, jak piszesz wyżej - są sytuacje, w których może się to przydać, ale totalnie się nie zgadzam z tym, żę nie jest to coś istotnego/krytycznego.

Tylko, że mój produkt to nie jest aplikacja, do której dokładam firmy, tylko każda z nich ma bazę u siebie.

No to jest trochę inna sytuacja, jak dajesz klientowi (np. biuru rachunkowemu) apkę (do tego instalowaną on premise) to może mieć wspólną bazę. Ale tutaj pytanie raczej dotyczy czegoś w modelu SaaS, gdzie masz jakiś swój serwer, do którego dopinają się kolejni klienci. W tej opcji raczej to kiepski pomysł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1