Ich denke, das ist eine wirklich gute Frage, aber die Antworten werden ein wenig verstreut sein, basierend auf den Bibliotheken, die Sie verwenden, und Ihren Erwartungen an eine "Migration".
Werfen wir einen Blick auf einige gängige Migrationsaktionen:
- Feld hinzufügen: Mongo macht dies sehr einfach. Fügen Sie einfach ein Feld hinzu und Sie sind fertig.
- Ein Feld löschen: Theoretisch sind Sie nicht wirklich an Ihr Schema gebunden, daher ist "Löschen" hier relativ. Wenn Sie die "Eigenschaft" entfernen und das Feld nicht mehr laden, spielt es keine Rolle, ob dieses Feld in den Daten enthalten ist. Also, wenn Sie es nicht tun sich darum kümmern, die Datenbank "aufzuräumen", dann wirkt sich das Entfernen eines Felds nicht auf die Datenbank aus. Wenn Sie tun Wenn Sie sich um die Bereinigung der DB kümmern, müssen Sie im Grunde eine riesige for-Schleife gegen die DB ausführen.
- Feldnamen ändern: Auch dies ist ein schwieriges Problem. Wenn Sie ein Feld "wo" umbenennen, benennen Sie es um? Wenn Sie möchten, dass die DB den neuen Feldnamen widerspiegelt, müssen Sie im Grunde eine riesige for-Schleife auf der DB ausführen. Um sicher zu gehen, müssen Sie wahrscheinlich Daten "hinzufügen", dann Code drücken und dann das alte Feld "unset" machen.
Einige Falten
Das Konzept eines Feldnamens zusammen mit einem ActiveRecord-Objekt ist jedoch nur ein wenig verzerrt. Ein ActiveRecord-Objekt stellt effektiv Zuordnungen von Objekteigenschaften zu tatsächlichen Datenbankfeldern bereit.
In einem typischen RDBMS ist die "Größe" eines Feldnamens nicht wirklich relevant. In Mongo belegt der Feldname jedoch tatsächlich Datenraum, und dies macht einen großen Unterschied in Bezug auf die Leistung.
Wenn Sie nun eine Art „Datenobjekt“ wie ActiveRecord verwenden, warum sollten Sie dann versuchen, vollständige Feldnamen in den Daten zu speichern? Die Datenbank sollte wahrscheinlich alle Felder in alphabetischer Reihenfolge mit einer Karte auf der Objektseite speichern. Ein Dokument könnte also 8 Felder/Eigenschaften haben und die DB-Namen wären "a", "b" ... "j", aber die Objektnamen wären lesbare Dinge wie "Name", "Preis", "Menge".
Der Grund, warum ich das anspreche, ist, dass es noch eine weitere Falte zu Ändern eines Feldnamens hinzufügt . Wenn Sie eine Zuordnung implementieren, führt das Ändern eines Feldnamens nicht wirklich zu einer Migration.
Noch mehr Falten
Wenn Sie tun Wenn Sie eine Migration auf eine Löschung durchführen möchten, müssen Sie dies nach tun ein Einsatz. Sie müssen auch bedenken, dass Sie dabei keinen aktuellen Speicherplatz sparen.
Mongo weist Speicherplatz vorab zu und „gibt ihn nicht wirklich zurück“, es sei denn, Sie führen eine DB-Reparatur durch. Wenn Sie also eine Reihe von Feldern in Dokumenten löschen, belegen diese Dokumente immer noch denselben Speicherplatz auf der Festplatte. Wenn die Dokumente später verschoben werden, können Sie Speicherplatz zurückfordern, Dokumente werden jedoch nur verschoben, wenn sie wachsen.
Wenn Sie ein großes Feld aus vielen Dokumenten entfernen, sollten Sie eine Reparatur durchführen oder den neuen integrierten compact
Befehl.