Używam Symfony od blisko 2 lat, do tej pory każdy projekt, który buduję, jest wdrażany specjalnie dla każdego klienta (tj. Jednego klienta, jednej bazy kodów, jednej bazy danych).SAAS i Multi-tenancy w Symfony2?
Powiedzmy, że mam aplikację do zarządzania projektami, którą chcę wdrożyć dla wielu klientów. Zakładając, że klienci będą iść z tym, co funkcje buduję do systemu, jeśli wdrożyć inny codebase (stąd inna dB) dla każdego klienta, tu są problemy przewiduję:
Pushing poprawek i uaktualnień będzie bolesne. Muszę przesłać go do każdego repozytorium, które wdrożyłem. Nie będzie on dobrze skalowany, jeśli mam 50 klientów korzystających z tej samej aplikacji.
Zarządzanie jest bolesne. Jak mogę zbudować dla siebie system administracyjny, w którym mogę przenieść WSZYSTKIE projekty do jednej tabeli HTML? W końcu każdy klient ma własną bazę danych, prawda? Dla mnie, aby zrobić cokolwiek znaczącego ze wszystkimi zapisami wszystkich moich klientów, potrzebuję sposobu na przeglądanie wszystkich ich baz danych za jednym zamachem, co ... Nie sądzę, żeby Symfony na to pozwalał. (Nie jestem pewien)
Problemy z kontem użytkownika. Jeśli użytkownik pracuje dla wielu firm, wszystkie z nich za pomocą mojej aplikacji do zarządzania projektami, ten użytkownik musi zarejestrować się wiele razy. (Wiem, że to można obejść, jeśli mogę użyć OAuth, ale staram się nie iść tam, jeśli mogę)
Oto rozwiązania myślałem i próbowali do pewnego stopnia.
Rozwiązanie 1
Jedna baza danych i jeden codebase dla wszystkich moich klientów. Projekty będą umieszczane pod jedną tabelą, faktury będą umieszczane pod jedną tabelą, wszystkie oznaczone przez ich własny identyfikator_klienta. Użytkownicy mogą być przypisani do projektów, więc nie ma potrzeby wielokrotnego zapisywania się.
To nie jest trudne do stworzenia. Ale co się stanie, jeśli różni klienci potrzebują różnych kolumn dla swoich faktur? Moja tabela faktur będzie nadal rozwijana (z różnymi polami, których oczekują różni klienci), a każdy wiersz może potencjalnie zawierać wiele pustych pól. Nie wspominając już, moja jednostka Faktura będzie rosnąć w wielkości pliku, a będę musiał zaktualizować schematu bazy danych za każdym razem, gdy nowy dostosowywania wchodzi.
Rozwiązanie 2
jednej bazy danych, gdzie każdy klient ma swój własny prefiks tabeli. Tak więc dla klienta A mogłem używać clientA_projects, clientA_invoices, clientA_configuration itp.
Jest to idealne rozwiązanie, jeśli każdy klient chce dostosować swoje pola. Ale czy to oznacza, że muszę utworzyć nowe jednostki i tworzyć klasy dla każdego nowego klienta, który wchodzi do systemu? Wygląda na to, że dzięki temu rozwiązaniu muszę aktualizować schemat bazy danych z każdym nowym klientem, który otrzymuję.
Obecnie jestem eksperymentuje z bazy danych schematu mniej (Mongo i sofa), mając nadzieję, że bez potrzeby określenia schematu tabeli góry, mogę wdrożyć rozwiązanie 1 bez kłopotów. Ale wciąż eksperymentuję i są sposoby, aby odejść, zanim odważę się wdrożyć gotową do produkcji aplikację, będąc nieznajomym problemami związanymi z mongo i kanapą z Symfony.
To jest miejsce, w którym utknąłem. Będąc samouczącym się programistą, czuję, że mam wiele dziur w mojej wiedzy, które wymagają wypełnienia (w przeciwieństwie do kogoś z tła CS). Nie ma zbyt wielu miejsc w Internecie mówiących o Symfony 2 i multi-tenancy (może szukam czegoś niewłaściwego). Jeśli ktokolwiek może wskazać mi jaśniejszy kierunek, może najlepsze praktyki, przykładowe projekty, naprawdę to doceniam!
Przy okazji planuję to zrobić w najnowszej wersji Symfony (2.3.2 w tej chwili).
Z góry dzięki chłopaki.
@ Lu0-dezhang jest tam jakąkolwiek możliwość podzielenia się swoimi wynikami? Uruchamiam nową aplikację SaaS przy użyciu Symfony3, ale nie mam pojęcia o bazach danych i organizacji projektu Symfony3, a także ... trudnych? – ReynierPM