Il mio capo sta attualmente lavorando su un progetto di database per un sistema ERP / CRM con supporto multi-tenant, che avrà un back-end Sql Server.
Alcuni punti chiave del design:
- Un'istanza del server ospiterà un database "condiviso" (modello univoco), più un database per azienda (stesso modello)
- Il database "condiviso" ha tabelle come contatti, utenti, ecc. a cui fare riferimento altri database aziendali.
- Il database "condiviso" ha trigger che controllano se i suoi dati possono essere cancellati in modo sicuro (se è utilizzato da qualsiasi azienda, l'operazione DELETE deve fallire)
- Se, per motivi di sicurezza, un'azienda non deve utilizzare informazioni condivisibili, deve essere impostata sulla propria istanza del server, con il proprio database "condiviso" che, in effetti, sarà utilizzato solo da tale azienda.
Ed ecco un esempio di implementazione per un sistema:
ISTANZA SERVER 1:
- DB condiviso
- ACME
- WayneEnterprises
- KwikEMart
ISTANTANEO SERVER 2:
- DB condiviso
- Umbrella
Il mio capo tiene conto di questo disegno sui seguenti vantaggi:
- Dato che c'è un db per società, le aziende più piccole come KwikEMart non soffriranno del peso di quelle più grandi.
- L'accesso utente può essere definito su una strategia "per azienda". In questo modo, Apu può ottenere il privilegio di leggere la tabella
Invoices
di KwikEMart, ma non di ACME.
Anche se capisco questi benefici, i compromessi sull'integrità mi sembrano schiaccianti.
In primo luogo, c'è l'evidente interruzione dell'integrità tra le aziende db e il db condiviso. È impossibile creare chiavi esterne attraverso i limiti del database.
In secondo luogo, cosa succederebbe se il Joker rovinasse il database di WayneEnterprise così male che Batman dovrà ripristinare un backup di un giorno? Se ACME, lo stesso giorno, ha deciso di rimuovere un indirizzo Gotham condiviso che era ancora in uso nella vecchia versione di WayneEnterprise db, allora ogni documento che utilizzava quell'indirizzo non sarebbe più in grado di visualizzarlo. A meno che, naturalmente, non ci sia un backup db condiviso dalla stessa ora che può essere ripristinata. Ma ANCHE se ce ne fosse una, potrebbe portare a ancora più problemi sia per ACME che per KwikEMart.
E sono proprio questi due problemi che mi sono venuti in mente, probabilmente anche altri.
Quindi la mia domanda qui sarebbe: stiamo andando nella giusta direzione con questo? E inoltre, come viene normalmente costruito questo tipo di sistema?
Qualsiasi guida sarà molto apprezzata.