Usando MongoDB per un'applicazione non scalabile?

2

Ho lavorato principalmente su database RDBMS. Ha studiato di recente MongoDB e mi è piaciuto dove non è necessario definire gli schemi in anticipo. Quindi gli sviluppatori di applicazioni possono iniziare subito a scrivere il codice. Lo svantaggio principale che si afferma nella maggior parte degli articoli è che MongoDB (o qualsiasi altro DB basato su documenti) non è adatto ai requisiti transazionali. Mi chiedo perché è non va bene per le transazioni. Sto solo cercando di capire con l'aiuto del caso d'uso che abbiamo in qualsiasi applicazione web

Considera un caso d'uso in cui abbiamo una pagina del profilo utente con più indirizzi come indirizzo primario, secondario e postale. L'utente può avere più conti bancari. In RDBMS creeremo sotto le tabelle

  1. Utente (Tabella user_profile)
  2. Indirizzo (chiave esterna che punta alla tabella utente)

L'utente e l'indirizzo vengono creati in una transazione, ma sia l'indirizzo che la creazione dell'utente devono essere atomici.

  1. Account (chiave esterna che punta alla tabella utente)

Con MongoDb ci sarà un singolo documento JSON User contenente array di indirizzi e matrici di account. Quindi la mia comprensione è che non c'è bisogno di transazioni in mongodb al primo posto in molti posti perché memorizzerà tutte le cose relative all'utente in un singolo documento. Ma sì, in alcuni casi in cui la transazione avviene tra gli utenti quindi avremo bisogno di transazioni come il trasferimento di account da un account a un altro account.

Quindi il modo in cui i documenti sono archiviati in MongoDB, la maggior parte dei luoghi in cui sono necessarie le transazioni saranno eliminati. Non è vero? Se sì c'è un modo in cui possiamo mantenere la transazione attraverso i documenti anche probabilmente attraverso il commit a due fasi?

Vedo un buon motivo per utilizzare mongodb o qualsiasi altro DB basato su documenti anche per applicazioni che richiedono transazioni in RDBMS, ma MongoDB elimina la necessità di transazione se stessa eccetto dove è richiesta la transazione attraverso il documento. L'utilizzo del DB basato su documenti offre il vantaggio di uno sviluppo più rapido, di un recupero e di un aggiornamento delle chiamate migliori.

Fammi sapere se la comprensione è corretta?

Aggiornamento: -

Gli altri vantaggi di Mongo che vedo sono: -

  1. I join non sono richiesti, quindi prestazioni migliori e query meno complesse.

  2. Il throughput di lettura / scrittura è migliore in mongo (non l'ho provato io stesso affermando solo dai fautori di archivi di documenti)

  3. Se per un documento particolare ho bisogno di memorizzare alcune informazioni extra (ad esempio, voglio memorizzare il campo di commento per specifici tipi di documento) Non devo aggiungere una colonna per tutti i documenti,

  4. Memorizza i dati in forma json

  5. Elimina la necessità di transazioni nella maggior parte dei luoghi come nell'esempio sopra indicato perché memorizza tutte le informazioni connesse nel documento singolo stesso

Contro

Il più grande e unico problema che vedo non è in grado di supportare la transazione tra i documenti che è richiesta la maggior parte delle applicazioni Web in un determinato momento, anche se i numeri possono essere pochi. Abbiamo bisogno di ricorrere a tecniche come il commit a due fasi in quei casi.

Inoltre sono d'accordo sul fatto che la dichiarazione So application developers straightaway can start writing the code può essere un vantaggio o una rovina a seconda della situazione. In RDBMS, il nostro tipo di policy viene elaborato, esaminato in anticipo e quindi seguito da tutti. Se vogliamo cambiare questa politica, è un po 'difficile. In Mongo come DB, non hai una politica in atto, ma devi decidere un contratto informale e contare che tutti lo seguono. Ovviamente ci sono molte possibilità che possa essere usato impropriamente, quindi (codice dell'applicazione) deve essere rivisto più spesso per confermare il contratto che abbiamo deciso e se per qualche motivo vogliamo cambiare contratto è molto facile da incorporare qui

    
posta user3222249 08.03.2017 - 14:03
fonte

3 risposte

1

Sì, la tua comprensione è corretta.

Se si eseguono più modifiche allo stesso documento in un'unica operazione, si tratterà di un processo atomico. Ma quando un'operazione influisce su più documenti, non vi è alcuna garanzia che eventuali query intermedie non restituiscano parzialmente i documenti prima dell'operazione e parzialmente i documenti dopo l'operazione.

I documenti nidificati di MongoDB incoraggiano a mettere i dati in un singolo documento che verrebbe distribuito su più righe di più tabelle in un database relazionale. Ciò significa che tali operazioni non sono così comuni come lo sono nei database relazionali. Ma se si verificano e la coerenza è importante, puoi gestirli con un bifase . Questa è una brutta soluzione, ma può funzionare se non hai altro modo.

    
risposta data 08.03.2017 - 14:29
fonte
8

Il tuo unico (main - post edit) plus per mongo sembra essere "Quindi gli sviluppatori di applicazioni possono iniziare subito a scrivere il codice"

Ma questo deve essere causato dalle attuali pratiche di sviluppo piuttosto che dalla tecnologia. Posso creare quelle tabelle in mssql altrettanto velocemente come in mongoDb.

Suppongo che nel tuo lavoro RDBMS devi trasferire il lavoro a un team DBA e aspettare che lo facciano?

Il problema è che non avere uno schema forzato non ti libera dal compito di progettare come archiviare i tuoi dati. In effetti potrebbe persino complicarlo se apporti modifiche in seguito e poi devi preoccuparti degli indirizzi v1 e v2, per esempio.

    
risposta data 08.03.2017 - 17:33
fonte
0

In RDBMS , its kind of we make the policy , review it upfront and then every one follow it. If we want to change that policy, its bit difficult. In Mongo like DB, you don't have policy in place, but you have to decide some informal contract and rely that every one follow it.

Penso che questa visione della differenza non rappresenti ciò che effettivamente fanno i DBMS. Un DBMS non è semplicemente un fornitore stupido di (purtroppo necessario) servizi di storage per i programmatori front-end, che possono essere valutati in base a quanto ottiene in termini di modo di fare le cose.

Per prima cosa, i sistemi di database possono anche implementare le regole aziendali; e se una regola aziendale si basa sul superamento di molti dati, l'RDBMS è un buon posto per implementarlo.

Un progetto di database realizzato in un RDBMS funge anche da dichiarazione esplicita di impegno per un particolare modello di dati. Un "contratto" informale non può mai avere lo stesso potere universale di applicazione.

Ho la sensazione che gran parte dell'hype sulle alternative agli RDBMS (a parte la questione della scalabilità, in cui i vantaggi sembrano essere genuini) nasce dal disagio con questa idea di seguire le regole applicate su come i dati vengono archiviati. Ma quel disagio, e (a mio parere) tentativi maliziosi di esserne liberati, manca alcuni punti molto importanti:

  1. Gli RDBMS sono una tecnica ingegneristica molto matura. Sebbene la struttura di un database possa sembrare statica e non modificabile, un database normalizzato ben progettato ha già la possibilità di modificare il modello (o di migrare i dati), attraverso la sua adesione alle regole di normalizzazione.
  2. Correlato a questo: i fautori di altri tipi di database sembrano sovente stimare eccessivamente la difficoltà di impostare o modificare un modello di database RDBMS. Non è così difficile come è presentato. Le difficoltà che sono intrinseche in esso sono inerenti a qualsiasi sistema di archiviazione che deve gestire sia i dati nuovi che quelli precedenti: non esiste un percorso di fuga NoSQL qui.
  3. I vincoli imposti da un particolare design RDB non sono necessariamente arbitrari e ingombranti. Un progetto di database può essere così com'è a causa dei reali requisiti aziendali. O perché fornisce il modo più efficiente per archiviare, elaborare e riepilogare grandi quantità di dati.

Nulla di ciò dovrebbe essere preso nel senso che MongoDB non è una soluzione eccellente per determinati scopi. Penso solo che sia spesso la soluzione migliore, senza una chiara comprensione di quali siano questi scopi e con una visione altamente distorta dell'utilità degli RDBMS.

    
risposta data 09.03.2017 - 13:45
fonte

Leggi altre domande sui tag