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?