2010-08-30 6 views

risposta

13

Penso che questa sia davvero una buona domanda, ma le risposte saranno un po 'sparse in base alle librerie che stai utilizzando e alle tue aspettative per una "migrazione".

Diamo uno sguardo ad alcune azioni comuni di migrazione:

  • Aggiungi un campo: Mongo rende questo molto facile. Basta aggiungere un campo e il gioco è fatto.
  • Elimina un campo: In teoria, non sei effettivamente legato al tuo schema, quindi "la cancellazione" qui è relativo. Se rimuovi la "proprietà" e non carichi più il campo, allora non importa se quel campo è nei dati. Pertanto, se si utilizza il per "ripulire" il database, la rimozione di un campo non influisce sul database. Se si usa il fare per pulire il DB, è necessario eseguire un ciclo di loop gigante contro il DB.
  • Modificare un nome campo: Anche questo è un problema difficile. Quando rinomini un campo "dove" lo stai rinominando? Se vuoi che il DB rifletta il nuovo nome del campo, allora devi fondamentalmente eseguire un ciclo di loop gigante sul DB. Per essere sicuri, probabilmente devi "aggiungere" dati, quindi premere il codice, quindi "annullare" il vecchio campo.

alcune rughe

Tuttavia, il concetto di un nome di campo in tandem con un oggetto ActiveRecord è solo un po distorta. Un oggetto ActiveRecord fornisce effettivamente mappature delle proprietà dell'oggetto ai campi effettivi del database.

In un tipico RDBMS la "dimensione" di un nome di campo non è realmente rilevante. Tuttavia, in Mongo, il nome del campo occupa effettivamente spazio dati e questo fa una grande differenza in termini di prestazioni.

Ora, se si sta utilizzando una forma di "oggetto dati" come ActiveRecord, perché si tenta di memorizzare i nomi dei campi completi nei dati? Il DB dovrebbe probabilmente memorizzare tutti i campi in ordine alfabetico con una mappa sul lato Oggetto. Quindi un documento potrebbe avere 8 campi/proprietà e i nomi dei DB dovrebbero essere "a", "b" ... "j", ma i nomi degli oggetti sarebbero leggibili come "Nome", "Prezzo", "Quantità".

Il motivo per cui viene presentato il problema è che aggiunge un'altra piega a Modificare un nome di campo. Se stai implementando una mappatura, la modifica di un nome di campo non causa affatto una migrazione.

Alcuni più rughe

Se fai desidera implementare una migrazione su una cancellazione, allora dovrete farlo dopo una distribuzione. Dovrai anche riconoscere che non salverai spazio sul disco quando lo farai.

Mongo pre-alloca lo spazio e in realtà non "restituisce" a meno che non si esegua una riparazione DB. Quindi, se elimini un mucchio di campi sui documenti, quei documenti occupano ancora lo stesso spazio sul disco. Se i documenti vengono successivamente spostati, è possibile recuperare spazio, tuttavia i documenti si spostano solo quando crescono.

Se si rimuove un grande campo da un sacco di documenti che si vorrà fare una riparazione o un check out il nuovo compact di comando sul posto.

1

Nessun proiettile d'argento. Aggiungere o rimuovere campi è più semplice con db non relazionale (non utilizzare campi non necessari o utilizzare nuovi campi), la ridenominazione di un campo è più semplice con il db tradizionale (di solito devi cambiare molti dati in caso di ridenominazione del campo in schemi db), la migrazione dei dati è alla pari, a seconda dell'attività.

+0

Non credo che la rinomina del campo esista ancora sull'ultimo mongo. –

1

Che aspetto ha il processo di migrazione con un db non relazionale?

Dipende se è necessario aggiornare tutti i dati esistenti o meno.

In molti casi, potrebbe non essere necessario toccare i vecchi dati, ad esempio quando si aggiunge un nuovo campo facoltativo. Se anche questo campo ha un valore predefinito, potrebbe non essere necessario aggiornare i vecchi documenti, se l'applicazione è in grado di gestire correttamente un campo mancante. Tuttavia, se si desidera creare un indice sul nuovo campo per poter cercare/filtrare/ordinare, è necessario aggiungere nuovamente il valore predefinito nei vecchi documenti.

Qualcosa come la ridenominazione dei campi (banale in un db relazionale, perché è sufficiente aggiornare il catalogo e non toccare alcun dato) è un'importante operazione in MongoDB (è necessario riscrivere tutti i documenti).

Se è necessario aggiornare i dati esistenti, in genere è necessario scrivere una funzione di migrazione che itera su tutti i documenti e li aggiorna uno per uno (sebbene questo processo possa essere condiviso ed eseguito in parallelo). Per i set di dati di grandi dimensioni, questo può richiedere molto tempo (e spazio) e si possono perdere le transazioni (se si finisce con una migrazione che si è interrotta a metà).