14 cose che vorrei sapere prima di iniziare con MongoDB

La traduzione dell'articolo è stata preparata alla vigilia dell'inizio del corso "Database non relazionali".

14 cose che vorrei sapere prima di iniziare con MongoDB

Highlights:

  • È estremamente importante sviluppare uno schema anche se è facoltativo in MongoDB.
  • Allo stesso modo, gli indici devono corrispondere allo schema e ai modelli di accesso.
  • Evitare di utilizzare oggetti di grandi dimensioni e array di grandi dimensioni.
  • Fai attenzione alle impostazioni di MongoDB, soprattutto quando si tratta di sicurezza e affidabilità.
  • MongoDB non dispone di un ottimizzatore di query, quindi devi fare attenzione quando esegui operazioni di query.

Lavoro con i database da molto tempo, ma ho scoperto MongoDB solo di recente. Ci sono alcune cose che vorrei sapere prima di iniziare a lavorarci. Quando una persona ha già esperienza in un determinato campo, ha nozioni preconcette su cosa sono i database e cosa fanno. Nella speranza di renderlo più facile da comprendere per gli altri, presento un elenco di errori comuni.

Creazione di un server MongoDB senza autenticazione

Sfortunatamente, MongoDB viene installato senza autenticazione per impostazione predefinita. Per una workstation a cui si accede localmente, questa pratica è normale. Ma poiché MongoDB è un sistema multiutente a cui piace utilizzare grandi quantità di memoria, sarà meglio metterlo su un server con quanta più RAM possibile, anche se lo utilizzerai solo per lo sviluppo. L'installazione sul server tramite la porta predefinita può essere problematica, soprattutto se nella richiesta è possibile eseguire qualsiasi codice Javascript (ad esempio, $where come idea per iniezione).

Esistono diversi metodi di autenticazione, ma il più semplice consiste nell'impostare un ID utente/password. Usa questa idea mentre pensi all'autenticazione fantasiosa basata su LDAP. Quando si tratta di sicurezza, MongoDB dovrebbe essere costantemente aggiornato e i log dovrebbero essere sempre controllati per eventuali accessi non autorizzati. Ad esempio, mi piace selezionare una porta diversa come porta predefinita.

Non dimenticare di associare la tua superficie di attacco a MongoDB

Lista di controllo della sicurezza MongoDB contiene buoni suggerimenti per ridurre il rischio di intrusioni nella rete e perdita di dati. È facile liquidarlo e dire che un server di sviluppo non necessita di un elevato livello di sicurezza. Tuttavia non è così semplice e questo vale per tutti i server MongoDB. In particolare, se non esiste un motivo convincente per l'utilizzo mapReduce, group o $dove, è necessario disabilitare l'uso del codice arbitrario in JavaScript scrivendo nel file di configurazione javascriptEnabled:false. Poiché i file di dati non sono crittografati in MongoDB standard, ha senso eseguire MongoDB Utente dedicato, che ha accesso completo ai file, con accesso limitato solo ad essi e la possibilità di utilizzare i controlli di accesso ai file propri del sistema operativo.

Errore durante lo sviluppo del circuito

MongoDB non utilizza uno schema. Ma ciò non significa che lo schema non sia necessario. Se desideri semplicemente archiviare documenti senza uno schema coerente, archiviarli può essere semplice e veloce, ma recuperarli in un secondo momento può essere difficile. dannatamente difficile.

Articolo classico "6 regole pratiche per la progettazione dello schema MongoDB" Vale la pena leggerlo e caratteristiche simili Esploratore di schemi nello strumento di terze parti Studio 3T, vale la pena utilizzarlo per controlli regolari dei circuiti.

Non dimenticare l'ordinamento

Dimenticare l'ordinamento può causare maggiore frustrazione e perdere più tempo rispetto a qualsiasi altra configurazione errata. Per impostazione predefinita MongoBD utilizza ordinamento binario. Ma difficilmente sarà utile a qualcuno. I tipi binari con distinzione tra maiuscole e minuscole, sensibili all'accento erano considerati curiosi anacronismi insieme a perline, caftani e baffi ricci negli anni '80 del secolo scorso. Ora il loro utilizzo è imperdonabile. Nella vita reale, "motocicletta" è la stessa cosa di "Motocicletta". E “Gran Bretagna” e “Gran Bretagna” sono lo stesso posto. Una lettera minuscola è semplicemente l'equivalente maiuscolo di una lettera maiuscola. E non farmi iniziare con l'ordinamento dei segni diacritici. Quando crei un database in MongoDB, utilizza regole di confronto senza distinzione di accento e Registrati, che corrispondono alla lingua e cultura dell'utente del sistema. Ciò renderà molto più semplice la ricerca tra i dati delle stringhe.

Crea raccolte con documenti di grandi dimensioni

MongoDB è felice di ospitare documenti di grandi dimensioni fino a 16 MB in raccolte e GrigliaFS Progettato per documenti di grandi dimensioni superiori a 16 MB. Ma solo perché lì possono essere collocati documenti di grandi dimensioni, conservarli lì non è una buona idea. MongoDB funzionerà meglio se memorizzi singoli documenti di dimensioni di pochi kilobyte, trattandoli più come righe in un'ampia tabella SQL. I documenti di grandi dimensioni saranno fonte di problemi prestazione.

Creazione di documenti con array di grandi dimensioni

I documenti possono contenere array. È meglio se il numero di elementi nell'array è lontano da un numero di quattro cifre. Se gli elementi vengono aggiunti frequentemente a un array, diventerà troppo grande per il documento che lo contiene e dovrà esserlo mossa, il che significa che sarà necessario aggiornare anche gli indici. Quando si reindicizza un documento con un array di grandi dimensioni, gli indici verranno spesso sovrascritti, poiché è presente un file record, che memorizza il suo indice. Questa reindicizzazione avviene anche quando un documento viene inserito o eliminato.

MongoDB ha qualcosa chiamato "fattore di riempimento", che offre spazio per la crescita dei documenti per ridurre al minimo questo problema.
Potresti pensare di poter fare a meno dell'indicizzazione degli array. Sfortunatamente, la mancanza di indici potrebbe causare altri problemi. Poiché i documenti vengono scansionati dall'inizio alla fine, la ricerca degli elementi alla fine dell'array richiederà più tempo e la maggior parte delle operazioni associate a tale documento verranno eseguite lento.

Non dimenticare che l'ordine delle fasi in un'aggregazione è importante

In un sistema di database con un ottimizzatore di query, le query che scrivi sono spiegazioni di ciò che desideri ottenere, non di come ottenerlo. Questo meccanismo funziona in analogia con l'ordinazione al ristorante: di solito si ordina semplicemente un piatto, senza dare istruzioni dettagliate al cuoco.

In MongoDB, istruisci il cuoco. Ad esempio, è necessario assicurarsi che i dati passino reduce il più presto possibile nella pipeline utilizzando $match и $projecte l'ordinamento avviene solo dopo reducee che la ricerca avvenga esattamente nell'ordine desiderato. Avere un ottimizzatore di query che elimina il lavoro non necessario, sequenzia in modo ottimale i passaggi e seleziona i tipi di join può rovinarti. Con MongoDB hai più controllo a scapito della comodità.

Strumenti come Studio 3T semplificherà la costruzione delle query di aggregazione in MongoDB. La funzionalità Editor di aggregazione consente di applicare le istruzioni della pipeline una fase alla volta e di ispezionare i dati di input e output in ogni fase per semplificare il debug.

Utilizzo della registrazione rapida

Non impostare mai le opzioni di scrittura di MongoDB per avere un'alta velocità ma una bassa affidabilità. Questa modalità "archivia e dimentica" sembra veloce perché il comando viene restituito prima che avvenga la scrittura. Se il sistema si arresta in modo anomalo prima che i dati vengano scritti su disco, andranno persi e finiranno in uno stato incoerente. Fortunatamente, MongoDB a 64 bit ha la registrazione abilitata.

I motori di archiviazione MMAPv1 e WiredTiger utilizzano la registrazione per impedire ciò, sebbene WiredTiger possa ripristinare l'ultimo file coerente punto di controllo, se la registrazione è disabilitata.

L'inserimento nel journal garantisce che il database sia in uno stato coerente dopo il ripristino e conservi tutti i dati finché non vengono scritti nel registro. La frequenza delle registrazioni è configurata utilizzando il parametro commitIntervalMs.

Per essere sicuri delle voci, assicurati che la registrazione sia abilitata nel file di configurazione (storage.journal.enabled)e la frequenza delle registrazioni corrisponde alla quantità di informazioni che puoi permetterti di perdere.

Ordinamento senza indice

Durante la ricerca e l'aggregazione, spesso è necessario ordinare i dati. Speriamo che ciò avvenga in una delle fasi finali, dopo aver filtrato il risultato per ridurre la quantità di dati da ordinare. E anche in questo caso, per l'ordinamento ti servirà indice. È possibile utilizzare un indice singolo o composto.

Se non esiste un indice adatto, MongoDB ne farà a meno. Esiste un limite di memoria di 32 MB sulla dimensione totale di tutti i documenti contenuti operazioni di smistamentoe se MongoDB raggiunge questo limite, genererà un errore o restituirà un errore recordset vuoto.

Ricerca senza supporto dell'indice

Le query di ricerca eseguono una funzione simile all'operazione JOIN in SQL. Per funzionare al meglio hanno bisogno dell'indice del valore della chiave utilizzata come chiave esterna. Questo non è ovvio perché l'uso non si riflette explain(). Tali indici sono in aggiunta all'indice scritto explain(), che a sua volta viene utilizzato dagli operatori di gasdotti $match и $sort, quando si incontrano all'inizio del gasdotto. Gli indici ora possono coprire qualsiasi fase pipeline di aggregazione.

Disattivazione dell'utilizzo degli aggiornamenti multipli

metodo db.collection.update() utilizzato per modificare parte di un documento esistente o l'intero documento, fino ad una sostituzione completa, a seconda del parametro specificato update. Ciò che non è così ovvio è che non elaborerà tutti i documenti nella raccolta a meno che non si imposti l'opzione multi per aggiornare tutti i documenti che soddisfano i criteri della richiesta.

Non dimenticare l'importanza dell'ordine delle chiavi in ​​una tabella hash

In JSON, un oggetto è costituito da una raccolta non ordinata di dimensioni pari a zero o più coppie nome/valore, dove nome è una stringa e valore è una stringa, un numero, un valore booleano, null, un oggetto o un array.

Sfortunatamente, BSON pone molta enfasi sull'ordine durante la ricerca. In MongoDB, l'ordine delle chiavi all'interno degli oggetti integrati questioniIe { firstname: "Phil", surname: "factor" } - non è lo stesso di { { surname: "factor", firstname: "Phil" }. Cioè, devi memorizzare l'ordine delle coppie nome/valore nei tuoi documenti se vuoi essere sicuro di trovarli.

Non confondere "nullo" и "non definito"

Valore "non definito" non è mai stato valido in JSON, secondo norma ufficiale JSON (ECMA-404 Sezione 5), anche se è utilizzato in JavaScript. Inoltre, per BSON è obsoleto e viene convertito in $null, che non è sempre una buona soluzione. Evitare di utilizzare "non definito" in MongoDB.

l'uso di $limit() без $sort()

Molto spesso, quando si sviluppa in MongoDB, è utile vedere solo un campione del risultato che verrà restituito da una query o da un'aggregazione. Per questo compito avrai bisogno $limit(), ma non dovrebbe mai essere nel codice finale a meno che non lo usi prima $sort. Questa meccanica è necessaria perché altrimenti non sarà possibile garantire l'ordine del risultato e non sarà possibile visualizzare i dati in modo affidabile. Nella parte superiore del risultato otterrai voci diverse a seconda dell'ordinamento. Per funzionare in modo affidabile, le query e le aggregazioni devono essere deterministiche, ovvero produrre gli stessi risultati ogni volta che vengono eseguite. Codice che contiene $limit(), ma no $sort, non sarà deterministico e potrebbe successivamente causare errori difficili da rintracciare.

conclusione

L'unico modo per rimanere delusi da MongoDB è confrontarlo direttamente con un altro tipo di database, come un DBMS, o arrivare ad utilizzarlo in base a determinate aspettative. È come paragonare un'arancia ad una forchetta. I sistemi di database servono a scopi specifici. È meglio semplicemente comprendere e apprezzare queste differenze per te stesso. Sarebbe un peccato esercitare pressioni sugli sviluppatori MongoDB lungo un percorso che li ha costretti a intraprendere il percorso DBMS. Voglio vedere modi nuovi e interessanti per risolvere vecchi problemi, come garantire l'integrità dei dati e creare sistemi di dati resistenti ai guasti e agli attacchi dannosi.

L'introduzione della transazionalità ACID da parte di MongoDB nella versione 4.0 è un buon esempio di introduzione di importanti miglioramenti in modo innovativo. Le transazioni multi-documento e multi-istruzione sono ora atomiche. È anche possibile regolare il tempo necessario per acquisire i blocchi e terminare le transazioni bloccate, nonché modificare il livello di isolamento.

14 cose che vorrei sapere prima di iniziare con MongoDB

Per saperne di più:

Fonte: habr.com

Aggiungi un commento