2012-11-10 17 views
17

Qui dovrai sopportare il fatto che forse ho trovato un po 'errata la terminologia in quanto non ero nemmeno consapevole che questo rientrava nella categoria "software multi-tenant" come "servizio", ma qui fa .SaaS multi-tenant PHP: separare i DB per ciascun cliente o raggrupparli?

Ho sviluppato un sistema di appartenenza (in PHP) per un client. Ora stiamo cercando di offrirlo come una soluzione completamente ospitata per i nostri altri clienti, fornendo un sottodominio (o anche il proprio dominio).

Le opzioni mi sembra di avere sul tavolo, per quanto riguarda l'archiviazione dei dati va sono:

Opzione 1 - Conservare tutto in 1 grande banca dati, e hanno un campo 'client_id' sui tavoli che hanno bisogno (ci sarebbero circa 30 tabelle a cui si applicherebbe), e avere una tabella "clienti" che memorizza le loro impostazioni principali, i dettagli, ecc. e il dominio per mapparli. Questo quindi imposta semplicemente una variabile accessibile a livello globale che contiene il proprio ID cliente individuale - Ovviamente dovrei modificare ogni singola query per verificare la colonna client_id.

Opzione 2 - Avere una tabella master con le tabelle di "riferimento condiviso" e la tabella "clienti". Quindi hanno 'blocchi' di altri database, che contengono ciascuno, ad esempio 10 client. Il cliente otterrebbe le proprie tabelle di database, precedute dal loro ID cliente. Questo aggiunge un po 'di sicurezza per proteggere dal vedere altri dati del client se qualcosa è andato veramente male.

Opzione 3 - Esattamente come l'opzione 2, tranne che si dispone di 1 database per ogni cliente, completamente isolandoli da altri client, e fornendo teoricamente un po 'più di protezione che, se le tabelle 1 del cliente sono stati violati o in altro modo danneggiato, non influenzerebbe nessun altro. Lo svantaggio più grande è che quando si distribuisce un nuovo client, è necessario impostare un intero database, utente e password, ecc. Ciò potrebbe anche causare una notevole quantità di spese generali, o sarebbe praticamente lo stesso come se si avessero tutti in uno Banca dati?

Anche alcuni punti - alcuni di questi clienti avranno oltre 5000 "clienti" e tutti i dettagli per questi clienti - ecco perché l'opzione 1 potrebbe essere un po 'problematica - se ho 100 clienti , che potrebbe equivalere a oltre mezzo milione di righe in 1 tabella.

Sono corretto nel pensare che l'opzione 3 sarebbe il modo migliore per andare in una situazione in cui la sicurezza dei dati dei clienti (e le informazioni di pagamento) è la chiave. Dalle raccomandazioni che ho avuto, alcune persone hanno detto di andare con l'opzione 1 perché "è più facile", ma in realtà non la vedo così. Lo vedo come un potenziale collo di bottiglia lungo la linea, in quanto sicuramente posso spostare i clienti molto più facilmente se hanno il loro database.

(FYI Il sistema è basato su PHP e MySQL)

risposta

11

opzione 3 è la più scalabile. Mentre all'inizio potrebbe sembrare più complicato, può essere completamente automatizzato e ti farà risparmiare grattacapi in futuro. È inoltre possibile scalare in modo più efficiente disponendo di database client su più server per migliorare le prestazioni.

+1

Grazie Ozzy - anche questo è stato il mio pensiero. L'unico svantaggio potenziale, sebbene non sia uno dei maggiori, sta spingendo gli aggiornamenti delle tabelle a tutti i database. Tuttavia, poiché tutti i DB eseguiranno lo stesso set di tabelle, con la stessa identica struttura, in teoria avrei pensato che fosse possibile creare uno script semplice per scorrere tutti i dettagli del DB, connettersi, eseguire la query di aggiornamento, disconnettersi e passare a il prossimo DB. – Sk446

2

Sono d'accordo con Ozzy - L'ho fatto per un prodotto di database online. Avevamo un database principale che fondamentalmente aveva una tabella utente glorificata. Ogni cliente aveva il proprio database. La cosa fantastica è che ho potuto spostare facilmente un database clienti dal server A al server B [mysql] e farlo con strumenti a riga di comando in un pizzico. Facendo anche la manutenzione su tabelle di grandi dimensioni, l'eliminazione/aggiunta di indici può rovinare la tua applicazione, specialmente se, ad esempio, l'aggiunta di un indice blocca la tabella [mysql]. Colpisce tutti.Con, presumibilmente, database più piccoli sei più immune da questo e hai più opzioni quando devi implementare le modifiche a livello di schema. Mi piace la flessibilità.

1

Quando molti anni fa ho progettato Innomatic, la piattaforma open source per la creazione di applicazioni SaaS in PHP, ho optato per la terza opzione: codice tenant a più e database inquilino singoli.

Nella mia esperienza, che è l'opzione più scalabile, ma ha anche bisogno di una serie di script per propagare le modifiche durante l'aggiornamento del codice, schemi di DB, consentendo alle applicazioni di un inquilino, ecc

Così un sacco di mia sforzo è andato nella costruzione di un motore estensibile basato su componenti per automatizzare completamente tutte quelle attività e ridurre al minimo l'amministrazione del sistema. Consiglio vivamente di costruire una tale architettura se si vuole adottare la terza opzione.