2011-07-15 10 views
5

Mam pełną bazę danych dla wielu dzierżawców z TenantID na wszystkich dzierżawionych bazach danych. Wszystko działa dobrze, z wyjątkiem tego, że teraz mamy obowiązek zezwalać najemowanym bazom danych na "łączenie się" z udostępnionymi danymi. Tak więc, na przykład, użytkownicy mogą tworzyć własne zapisy "Bank" i łączyć je z kontami, ale mogą również łączyć konta z "globalnymi" zapisami bankowymi, które są wspólne dla wszystkich najemców.Baza danych wielu lokatorów z niektórymi udostępnionymi danymi

muszę eleganckie rozwiązanie, które zachowuje integralność referencyjna

sposobów I mają pochodzić z tak daleko:

  1. Kopiowanie: wszystkie udostępniane dane są kopiowane do każdego lokatora, być może z " Flaga systemu. Zmiany w udostępnianych danych wiążą się z ogromnymi aktualizacjami dla wszystkich najemców. Prawdopodobnie najprostsze rozwiązanie, ale nie podoba mi się powielenie danych:
  2. Identyfikator specjalny: wszystkie łącza do udostępnionych danych używają specjalnych identyfikatorów (np. Negatywnych numerów identyfikacyjnych). Wskazują one, że TenantID nie ma być używany w relacji. Nie możesz użyć FK, aby wymusić to poprawnie, a na pewno nie możesz ponownie użyć identyfikatora najemców, jeśli masz DOWOLNE FK. Do integralności można użyć tylko wyzwalaczy.
  3. Oddzielne ID: wszystkie tabele, które mogą prowadzić do udostępnionych danych mają DWIE FK; jeden używa TenantID i łączy się z lokalnymi danymi, drugi nie używa TenantID i łączy do udostępnionych danych. Ograniczenie wskazuje, że jeden lub drugi ma być użyty, a nie oba. To chyba najbardziej "czyste" podejście, ale wydaje się po prostu ... brzydkie, ale może nie tak brzydkie jak inne.

Więc moje pytanie jest w dwóch częściach:

  • Czy są jakieś opcje Nie rozważane?
  • Czy ktoś miał doświadczenie z tymi opcjami i ma jakieś opinie na temat zalet/wad?

Odpowiedz

3

Kolega dał mi wgląd, który działał dobrze. Zamiast myśleć o dostępie najemcy jako najemcy, pomyśl o tym jako o dostępie do grupy. Najemca może należeć do wielu grup, w tym do własnej określonej grupy. Dane należą wówczas do grupy, prawdopodobnie do określonej grupy Najemcy, a może do bardziej ogólnej.

Zatem "Mój Bank" należałby do grupy Najemcy, "Bank lokalny" należałby do regionalnego ugrupowania, do którego lokator ma dostęp, a "Bank Światowy" należałby do grupy "Wszyscy".

Dzięki temu zachowujesz integralność, FK, a także dodajesz możliwość posiadania hierarchii lokatorów, nie jest to coś, czego w ogóle potrzebuję w moim scenariuszu, ale miła mała możliwość.

0

Na Citus budujemy bazę danych dla wielu dzierżawców z wykorzystaniem PostgreSQL. W przypadku informacji udostępnianych przechowujemy je w tak zwanych "reference" tables, które są rzeczywiście kopiowane we wszystkich węzłach. Jednak zachowujemy tę synchronizację i spójność za pomocą 2PC, a także możemy tworzyć relacje FK między danymi referencyjnymi i niereferencyjnymi. Możesz znaleźć więcej informacji here.