Utilizzo di tenant_id nel database multi-tenant

2

Stiamo costruendo un'applicazione web SASS in cui ogni azienda utilizzerà il proprio schema di database. Usando postgresql, c'è una tabella 'società' nello schema pubblico che contiene il nome della società e il nome dello schema a cui passare. Nello schema del tenant ci sono molte tabelle che memorizzano dati specifici per questa azienda. Ogni richiesta, lo schema del tenant viene impostato in base alla società corrente memorizzata in una sessione.

La discussione interna è questa:

Le tabelle nello schema titolare hanno una colonna company_id per indicare la relazione tra i dati e la società? O è la società attuale implicita dallo schema utilizzato ed è eccessivo usare il company_id in ogni tabella che ha una relazione con un'azienda?

Opinione 1

La prima opinione è che le relazioni tra la società e le altre tabelle dovrebbero essere definite esplicitamente nella struttura della tabella. Ciò abilita anche le query di ActiveRecord come: current_company.projects.find(3) . L'integrità referenziale è applicata, anche per le relazioni che attraversano il limite dello schema.

Opinione 2

La seconda opinione è che sarebbe meglio eliminare tutte le colonne company_id in tutte le tabelle, perché quando si passa a uno schema tenant, non sarà mai possibile ottenere dati da altre società. La stessa query ActiveRecord deve ora essere scritta come Project.find(3) . La società è implicita dallo schema scelto, non attraverso una relazione. Inoltre, il rilascio della colonna company_id da ogni tabella consente di risparmiare spazio su disco.

Quale approccio ritieni migliore?

    
posta zwippie 02.06.2015 - 14:16
fonte

1 risposta

2

Uno schema in Postgresql è simile a un "database", ad esempio, in MySQL; è uno spazio dei nomi contenente una raccolta distinta e separata di oggetti di database (tabelle, viste, stored procedure, trigger, ecc.). La creazione di uno schema per ciascun tenant ti consentirà di

  • Tieni aperta una connessione al database e passa da uno schema all'altro,
  • Query su più titolari utilizzando UNION e
  • Evita i problemi in cui qualcuno cambia l'ID e accede ai dati di un'altra azienda.

Se crei uno schema per ciascuna azienda, non avrai bisogno dei campi company_id in ogni tabella; lo schema fornirà la separazione necessaria. La tua query ActiveRecord avrà un aspetto simile a company.Projects.find(3) , dove company è il nome dello schema corrispondente a quel determinato titolare.

    
risposta data 02.06.2015 - 16:41
fonte

Leggi altre domande sui tag