Multi-tenant Rails application: jakie są zalety i wady różnych technik?

Oryginalnie napisałem aplikację Ruby on Rails dla jednego klienta. Teraz zmieniam go tak, aby mógł być używany dla różnych klientów. Moim celem końcowym jest to, że jakiś użytkownik (nie ja) może kliknąć przycisk i utworzyć nowy projekt. Następnie wszystkie niezbędne zmiany (nowy schemat, nowe tabele, obsługa kodu) są generowane bez potrzeby edytowania bazy danych.plik yml lub dodać nowe definicje schematu. Obecnie korzystam z dostępu SCOPED. Więc mam model projektu i inne powiązane modele mają kolumna project_id.

Przejrzałem inne posty dotyczące aplikacji multi-tenant w Rails. Wiele osób wydaje się sugerować stworzenie innego schematu dla każdego nowego klienta w Postgres. Dla mnie jednak nie jest zbyt przydatne, aby nowy klient miał inny schemat pod względem modelu danych. Każdy klient będzie miał te same tabele, wiersze, kolumny itp.

Moją wizją dla każdego klienta jest to, że moja baza danych produkcji najpierw zawiera tabelę różnych projektów / klientów. I każdy z tabele te łączą się z zestawem tabel, które są prawie takie same z różnymi danymi. Innymi słowy tabela tabel. Innymi słowy, pierwsza tabela będzie mapować do innego zestawu danych dla każdego klienta, który ma tę samą strukturę.

Czy sposób, w jaki wyjaśniłem moją wizję, jest w ogóle podobny do sposobu, w jaki Postgres implementuje różne "schematy"? Czy to wygląda jak zagnieżdżone tabele? A może Postgres musi odpytywać wszystkie informacje w bazie danych? Obecnie nie używam Postgres, ale byłbym skłonny dowiedzieć się, czy pasuje do projektu. Jeśli znasz oprogramowanie bazodanowe, które współpracuje z Rails, które pasuje do moich potrzeb, daj mi znać.

W tej chwili używam zakresów do realizacji aplikacji wielodostępnych, ale nie czuję się skalowalny ani czysty. To jednak sprawia, że bardzo łatwo dla nietechnicznego użytkownika stworzyć nowy projekt, pod warunkiem, że podam im informacje, które można wypełnić. Czy wiesz, czy jest to możliwe z definicją Postgres Multi-schema aby to działało automatycznie po kliknięciu przycisku przez użytkownika? I wolałbym, żeby to było obsługiwane przez Rails, a nie przez zewnętrzny skrypt, jeśli to możliwe? (proszę doradzić tak czy inaczej)

Najważniejsze, czy polecacie jakieś pluginy lub że powinienem przyjąć inny framework do tego zadania? Okazało się, że Rails jest ograniczony w niektórych przypadkach abstrakcji, jak powyżej i jest to pierwszy raz, gdy napotkałem problem ze skalowaniem Rails.

Wszelkie porady związane z aplikacjami multi-tenant lub Moja sytuacja jest Witam. Wszelkie pytania do wyjaśnienia lub dodatkowe porady są również mile widziane.

Dzięki, -- Dave

Author: David Groff, 2011-08-10

3 answers

Nie zapomnij o używaniu domyślnych zakresów, podczas tworzenia nazwanych zakresów tak, jak teraz działa, wydaje się, że można to zrobić lepiej. Natknąłem się na Ten poradnik Samuela Kadolpha dotyczący tego problemu kilka miesięcy temu i wygląda na to, że może on działać dobrze dla twojej sytuacji i mieć korzyść z utrzymania aplikacji wolnej od niektórych funkcji PgSQL.

Zasadniczo sposób, w jaki opisuje konfigurację aplikacji polega na dodaniu pojęć tennants do twojego aplikacji, a następnie za pomocą tego zakresu danych w czasie kwerendy za pomocą bazy danych.

 1
Author: Devin M,
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-08-09 21:19:06

MSDN ma dobre wprowadzenie do architektury danych wielodostępnych .

Na jednym końcu widma masz jedną bazę danych na dzierżawcę ("shared nothing"). "Shared nothing" sprawia, że odzyskiwanie po awarii jest dość proste i ma najwyższy stopień izolacji między najemcami. Ale ma również najwyższy średni koszt na najemcę i obsługuje najmniejszą liczbę najemców na serwer.

Na drugim końcu spektrum przechowuje się numer ID dzierżawcy w każdym wierszu każdej współdzielonej tabeli ("shared everything"). Funkcja "Shared everything" sprawia, że odzyskiwanie po awarii jest trudne-dla pojedynczego dzierżawcy musiałbyś przywrócić tylko niektóre wiersze w każdej współdzielonej tabeli-i ma najniższy stopień izolacji. (Źle utworzone zapytania mogą ujawniać prywatne dane.), Ale ma najniższy koszt na dzierżawcę i obsługuje największą liczbę najemców na serwer.

Moją wizją dla każdego klienta jest to, że moja baza produkcyjna najpierw ma tabela różnych projektów / klientów. I każdy z tabele te linki do zestawu tabel, które są prawie takie same z różnymi data. Innymi słowy tabela tabel. Lub innymi słowy, pierwszy tabela będzie mapować do innego zestawu danych dla każdego klienta, który ma ta sama struktura.

To brzmi jakbyś mówił o jednym schemacie na dzierżawcę. Zwróć szczególną uwagę na uprawnienia (SQL GRANT i REVOKE. I zmienić domyślne uprawnienia .)

 8
Author: Mike Sherrill 'Cat Recall',
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-08-10 12:10:39

Istnieją dwa railscasty na multitenancy, które używają zakresów i subdomen i drugi, który pomaga w obsłudze wielu schematów.

Istnieje równieżmultitenant gem , które mogą pomóc w Twoich zakresach iApartament gem do obsługi wielu schematów.

Oto również dobra prezentacja multitenancy-with-rails .

 5
Author: cwadding,
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
2012-11-09 17:37:30