Wie verwalten Sie eine wichtige Schemaänderung, wenn Sie einen Nosql-Speicher wie SimpleDB verwenden?
Ich weiß, dass ich immer noch in SQL-Begriffen denke, aber nachdem ich ein paar Wochen mit SimpleDB gearbeitet habe, muss ich eine Änderung an einer laufenden Datenbank vornehmen. Ich möchte eine der Objektklassen ändern, um eine eindeutige ID anstelle von einem Geschäftsnamen zu haben, und da es von einem anderen Objekt referenziert wird, muss ich auch den Referenzwert in diesen Objekten aktualisieren.
Mit einer SQL-Datenbank würden Sie eine Reihe von SQL-Anweisungen als Teil des Client-Software-Bereitstellungsprozesses ausführen. Offensichtlich funktioniert das nicht mit SimpleDB als
Einige Lösungen, an die ich gedacht habe, sind
Jede Domain hat eine Versionsnummer. Die Client-Software weiß, welche Version der Domäne sie verwenden soll. Schreiben Sie Code, der die Daten von einer Domänenversion in eine andere kopiert, und nehmen Sie die erforderlichen Änderungen vor. Sie können dann neue Client-Software installieren, die dann auf die neue Domänenversion zugreift. Dieser Ansatz funktioniert nur, wenn Sie während des Aktualisierungsvorgangs den gesamten Schreibzugriff "einfrieren" können.
Jedes Element hat ein Versionsattribut, das das beim Speichern verwendete Format angibt. Der Client verwendet dieses Attribut beim Laden des Objekts in den Speicher. Das Objekt kann dann in das neueste Format konvertiert werden, wenn es in SimpleDB zurückgeschrieben wird. Das Problem dabei ist, dass die neue Software auf allen Servern bereitgestellt werden muss, bevor Schreibvorgänge im neuen Format ausgeführt werden, oder Clients, die die alte Software ausführen, können das neue Format nicht lesen.
Alles ist ziemlich komplex und ich frage mich, ob ich etwas verpasse?
Danke
Richard
Ich verwende etwas ähnliches wie Ihre zweite Option, aber ohne das Versionsattribut.
Versuchen Sie zunächst, Ihre Änderungen an Dingen beizubehalten, die leicht abwärtskompatibel sind - das Ändern des Primärschlüssels ist das Worst-Case-Szenario dafür.
Das Entfernen eines Feldes ist einfach - hören Sie einfach auf, in dieses Feld zu schreiben, wenn auf allen Servern eine Version ausgeführt wird, die dies nicht erfordert.
Das Hinzufügen eines Felds erfordert, dass Sie dieses Objekt niemals mit Code schreiben, der dieses Feld nicht speichert. Wenn Sie die neue Version nicht überall gleichzeitig bereitstellen können, verwenden Sie eine Zwischenversion, die das Speichern des Felds unterstützt, bevor Sie eine Version bereitstellen, für die dies erforderlich ist.
Das Ändern eines Felds ist nur eine Kombination dieser beiden Operationen.
Bei diesem Ansatz werden Änderungen nach Bedarf angewendet - Schreiben mit der neuen Version, aber Lesen der alten Version mit Standardwerten oder abgeleiteten Werten für das neue Feld.
Sie können denselben Code verwenden, um alle Datensätze gleichzeitig zu aktualisieren, obwohl dies für große Datenmengen möglicherweise nicht geeignet ist.
Das Ändern des Primärschlüssels kann auf die gleiche Art und Weise gehandhabt werden, könnte aber sehr komplex werden, abhängig davon, welches NOSQL-System Sie verwenden. Sie sind wahrscheinlich in diesem Fall daran interessiert, benutzerdefinierten Migrationscode zu entwickeln.
Tags und Links nosql amazon-simpledb