Che cosa è meglio per la scalabilità per questo specifico set di dati, MongoDB o MySQL?

0

Ho un'app Web con utenti, moduli e volontari registrati su tali moduli.

Attualmente sto usando MongoDB e l'ho configurato con una collezione per amministratori e una raccolta per moduli con volontari collegati ai moduli.

Non è molto efficiente perché devo rendere i moduli su due pagine, quindi i dati del modulo sono allegati agli amministratori nella raccolta utente, ma ripetuti nella raccolta moduli in modo che possano essere visualizzati singolarmente nella pagina del modulo. / p>

Attualmente ho una pagina che deve eseguire il rendering di amministratori e moduli e quindi la pagina del modulo che esegue solo il rendering di un singolo modulo. Sto cercando di ridurre al minimo le query, ed è per questo che ho copiato i dati del modulo sugli oggetti utente (le informazioni di amministrazione sono anche allegate al modulo, mantenendolo a una query per ogni pagina).

Le informazioni sui volontari sono allegate ai moduli, quindi vengono copiate in entrambe le raccolte. Ovviamente questo è un terribile spreco di spazio. Spero che qualcuno possa aiutarmi a riprogettarlo e raccomandare se seguire NoSQL o passare a MySQL / Postgres.

Non ho abbastanza esperienza per sapere quale è meglio per questa specifica configurazione, o come impostare schemi / architetture per essere scalabili.

Grazie mille per il tuo tempo. Qualsiasi consiglio è apprezzato, comprese le risorse rilevanti di cui non sono certo a conoscenza.

    
posta David Crosby 13.03.2015 - 23:44
fonte

2 risposte

0

Sulla base dei dati che hai fornito, direi che questo potrebbe essere fatto per funzionare in entrambi i modi.

Tuttavia, dal momento che hai iniziato con MongoDB, evidenzierò quanto segue:

Prima di tutto, penso che stai iniziando dalla premessa sbagliata: stai cercando di ridurre le letture al database. Ma MongoDB è progettato per un accesso rapido a grandi quantità di dati, ecco perché e quando lo si utilizzerà.

Se stavi parlando di cercare di ridurre 40 letture a 5 letture sarebbe una cosa sola. Ma da quello che posso dire che stai tagliando 2 letture a 1 lettura. Se il tuo MongoDB non può gestire 2 letture per richiesta utente, stai facendo qualcosa di sbagliato. Controlla i tuoi indici.

E se effettivamente ricevi troppo traffico, puoi sempre aggiungere un altro server al set di repliche o dividere le raccolte.

Quindi, vorrei semplicemente archiviare gli amministratori in una raccolta e le forme in un'altra. La duplicazione dei dati non è mai buona e, data la natura non transazionale di MongoDB, è possibile eseguirli senza corrispondere in alcuni casi.

Per poter efficacemente incrociare il riferimento a entrambe queste raccolte, puoi configurare lo schema in questo modo:

Amministratori

{
   "_id" : 12345
   "name" : "Joe"
   "formIds" : [
      1234,
      5678
      9123
   ]
}

Forme

{
   "_id" : 1234,
   "field1" : "bla",
   "field2" : "bla"
   "adminId" : 12345
}

In questo modo puoi creare indici e cercare l'amministratore di formId e il modulo di adminId . Puoi anche utilizzare solo uno dei metodi di riferimento incrociato, a seconda di quale sia più adatto ai tuoi schemi di accesso.

Nota: ora siamo finiti fondamentalmente con uno schema di database relazionale, appena eseguito in MongoDB. E quindi non farà una grande differenza.

Quindi, dove MongoDB sarebbe utile è, se si dispone di moduli, che hanno campi variabili o cambiano nel tempo o moduli che hanno dati annidati, tutti richiedono uno schema complesso su MySQL.

    
risposta data 14.03.2015 - 02:43
fonte
2

Non possiamo rispondere a questo. Dipende non solo dal tuo schema o dalla sua mancanza. Dipende anche da come colpisci il servizio (nel codice), da come i tuoi utenti colpiscono l'applicazione, da quale tipo di cache sei preparato per l'implementazione, ecc.

Utilizza il meccanismo di archiviazione più adatto a come pensi e codice. Mantenere le interazioni con quel servizio di archiviazione come isolate e astratte come è ragionevole che tu faccia. E se le prestazioni diventano un problema, noleggia un DBA e / o il servizio completamente astratto in modo da confrontare le opzioni con un carico di lavoro rappresentativo.

    
risposta data 14.03.2015 - 00:24
fonte

Leggi altre domande sui tag