Utilizzo Symfony da quasi 2 anni, finora, ogni progetto che costruisco viene distribuito in modo specifico per ciascun client (vale a dire un client, un codebase, un db).SAAS e multi-tenancy in Symfony2?
Diciamo che ho un'app di gestione dei progetti che desidero distribuire per molti client. Supponendo che i clienti andranno con qualsiasi caratteristiche costruisco nel sistema, se schiero una base di codice diverso (quindi, un DB diverso) per ogni cliente, qui ci sono i problemi che prevedono:
Pushing correzioni di bug e aggiornamenti sarà doloroso. Devo inviarlo a tutti i repository che ho distribuito. Non scalerà bene se ho 50 client che usano la stessa app.
La gestione è dolorosa. Come faccio a creare un sistema di amministrazione per me stesso in cui posso inserire TUTTI i progetti in un'unica tabella HTML? Dopotutto, ogni client ha il proprio database, giusto? Per farmi fare qualcosa di significativo con tutti i record di tutti i miei clienti, ho bisogno di un modo per esaminare tutti i loro database in una volta sola, il che ... non credo che Symfony lo consenta. (Non sono sicuro)
Problemi dell'account utente. Se un utente lavora per più aziende, tutte utilizzando la mia app Gestione progetti, l'utente deve registrarsi più volte. (So che questo può essere aggirato se uso oauth, ma sto cercando di non andare lì se posso)
Qui ci sono le soluzioni che ho pensato e provato a un certo punto.
Soluzione 1
un database e una base di codice per tutti i miei clienti. I progetti andranno sotto una tabella, le fatture vanno sotto una tabella, tutte contrassegnate dal proprio client_id. Gli utenti possono essere assegnati ai progetti quindi non è necessario registrarsi più volte.
Questo non è difficile da creare. Ma cosa succede se clienti diversi hanno bisogno di colonne diverse per le loro fatture? La mia tabella delle fatture continuerà ad espandersi (con campi diversi richiesti da client diversi) e ogni riga può potenzialmente contenere molti campi null. Per non parlare, la mia entità fattura crescerà in dimensioni del file, e dovrà aggiornare lo schema del database ogni volta che una nuova personalizzazione entra.
Soluzione 2
Un database in cui ogni cliente ha il proprio prefisso tabella. Quindi per il cliente A, potrei usare clientA_projects, clientA_invoices, clientA_configuration ecc.
Questo è l'ideale se ogni cliente desidera personalizzare i propri campi. Ma questo significa che devo creare una nuova entità e formare classi per ogni nuovo cliente che entra nel sistema? Sembra che con questa soluzione, ho bisogno di aggiornare lo schema del database con ogni nuovo client che ottengo.
Attualmente, sto sperimentando con i database di schema-less (mongo e divano), sperando che senza bisogno di specificare lo schema della tabella in anticipo, posso implementare Soluzione 1 senza problemi. Ma sto ancora sperimentando, e ci sono modi per andare prima di avere il coraggio di implementare un'app pronta per la produzione, non avendo familiarità con i problemi di mongo e couch con Symfony.
Quindi, questo è il punto in cui sono bloccato. Essendo un programmatore autodidatta, sento di avere un sacco di buchi nella mia conoscenza che richiede il riempimento (al contrario di qualcuno di un background CS). Non ci sono molti posti sul web che parlano di Symfony 2 e multi-tenancy (forse sto cercando la cosa sbagliata). Se qualcuno di qualcuno può indicarmi una direzione più chiara, forse le migliori pratiche, progetti di esempio, lo apprezzerò davvero!
Btw, ho intenzione di eseguirlo nell'ultima versione di Symfony (2.3.2 in questo momento).
Grazie in anticipo ragazzi.
@ LU0-dezhang c'è c'è qualche possibilità per te di condividere i tuoi risultati? Sto avviando una nuova app SaaS usando Symfony3 ma non ho idea di database e organizzazione dei progetti Symfony3, quindi ... tosti? – ReynierPM