Wie können Schemaänderungen in einem NOSQL-Speichersystem implementiert werden?

8

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

  • Es gibt keine Entsprechung einer SQL-Aktualisierungsanweisung.
  • Aufgrund der verteilten Natur von SimpleDB gibt es keine Möglichkeit zu wissen, wann die Änderungen, die Sie an der Datenbank vorgenommen haben, auf alle Knoten "ausgefiltert" wurden, auf denen Ihre Client-Software ausgeführt wird.

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

    
richard 30.08.2011, 05:42
quelle

2 Antworten

4

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.

    
Tom Clarkson 31.08.2011, 00:39
quelle
1

RavenDB eine andere NoSQL-Datenbank verwendet Migrationen, um dies zu erreichen

Ссылка

Ссылка

Normalerweise wird diese Art von Änderungen von Ihrer Anwendung gehandhabt, die beim Laden von Version X und beim Konvertieren in Version Y und Persistieren das Schema in ein neueres ändert

    
Justin King 30.08.2011 05:46
quelle

Tags und Links