PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Schemi di PostgreSQL per applicazioni multi-tenant

Le prestazioni non sono necessariamente peggiori. Come spiega l'articolo, esistono condizioni specifiche che rendono lo schema migliore o peggiore a seconda della progettazione dell'applicazione e del carico di lavoro. Lascia che ti spieghi i compromessi tra gli approcci "schema tenant" e "tabella condivisa":

schema tenant è meglio quando si dispone di un numero relativamente piccolo di inquilini abbastanza grandi. Un esempio potrebbe essere un'applicazione di contabilità, con solo utenti con abbonamento a pagamento. Le cose che lo rendono l'opzione più performante per te includono:

  • un piccolo numero di tenant con molti dati ciascuno
  • uno schema relativamente semplice senza molte tabelle per tenant
  • necessità di personalizzare gli schemi di alcuni tenant
  • capacità di utilizzare i ruoli del database per tenant
  • requisito per migrare i dati di un tenant da un server a un altro
  • possibilità di creare un app server dedicato nel cloud per ogni tenant

Le cose che la rendono un'opzione con scarse prestazioni includono:

  • molti inquilini con pochissimi dati ciascuno
  • Approccio stateless alle connessioni in cui ogni richiesta potrebbe essere qualsiasi tenant
  • libreria client o orm che memorizza nella cache i metadati per tutte le tabelle (come ActiveRecord)
  • un requisito per un pool di connessioni e/o una memorizzazione nella cache efficienti e ad alte prestazioni
  • problemi con VACUUM e altre operazioni amministrative di PostgreSQL con scarsa scalabilità su migliaia di tabelle.

Il fatto che lo schema tenant sia dannoso per migrazioni/modifiche allo schema dipende davvero da come le stai facendo. Non è utile per implementare rapidamente una modifica dello schema universale, ma è utile per implementare le modifiche dello schema come un'implementazione graduale tra i tenant.

tabella condivisa funziona meglio per le situazioni in cui hai molti tenant e molti dei tuoi tenant hanno pochissimi dati. Un esempio di ciò potrebbe essere un'applicazione mobile social media che consente account gratuiti e quindi ha migliaia di account abbandonati. Altre cose che rendono vantaggioso il modello di tabella condivisa sono:

  • meglio per il pool di connessioni, poiché tutte le connessioni possono utilizzare lo stesso pool
  • migliore per l'amministrazione di PostgreSQL, grazie al minor numero di tabelle totali
  • meglio per migrazioni e modifiche dello schema, poiché esiste un solo "set" di tabelle

Lo svantaggio principale della tabella condivisa è la necessità di aggiungere la condizione del filtro tenant a ogni singola query nel livello dell'applicazione. È anche problematico perché:

  • Le query che si uniscono a molte tabelle possono funzionare male perché il filtro tenant annulla la pianificazione delle query
  • le tabelle che raggiungono i 100 milioni di righe possono causare problemi specifici di prestazioni e manutenzione
  • nessun modo per apportare modifiche alle applicazioni o aggiornamenti dello schema specifici del tenant
  • più costoso migrare tenant tra server

Quindi quale modello "funziona meglio" dipende davvero da quali compromessi ti danneggiano di più.

Esiste anche un modello ibrido, "tenant-view", in cui i dati effettivi sono archiviati in tabelle condivise, ma ogni connessione dell'applicazione utilizza viste barriera di sicurezza per visualizzare i dati. Questo ha alcuni dei compromessi di ogni modello. In primo luogo, presenta i vantaggi in termini di sicurezza del modello con schema tenant con alcuni degli svantaggi di prestazioni di entrambi i modelli.