如何在NOSQL存储系统中实现架构更改

ric*_*ard 8 nosql amazon-simpledb

当您使用SimpleDB等Nosql存储时,如何管理主要模式更改?

我知道我仍在思考SQL术语,但在使用SimpleDB几周后,我需要对正在运行的数据库进行更改.我想将其中一个对象类更改为具有唯一ID,而不是商业名称,并且由于它被另一个对象引用,我还需要更新这些对象中的引用值.

使用SQL数据库,您将运行一组sql语句作为客户端软件部署过程的一部分.显然,这不适用于像SimpleDB这样的东西

  • 没有等效的SQL更新语句.
  • 由于SimpleDB的分布式特性,无法知道您对数据库所做的更改何时"过滤"到运行客户端软件的所有节点.

我想到的一些解决方案是

  • 每个域都有一个版本号.客户端软件知道应该使用哪个版本的域.编写一些代码,将数据从一个域版本复制到另一个域版本,随时进行所需的更改.然后,您可以安装新的客户端软件,然后访问新的域版本.除非您可以在更新过程中"冻结"所有写访问权限,否则此方法将无效.

  • 每个项目都有一个版本属性,指示存储时使用的格式.将对象加载到内存时,客户端使用此属性.然后,在将对象写回SimpleDB时,可以将对象转换为最新格式.这样做的问题是,在新格式的任何写入发生之前,需要将新软件部署到所有服务器,或者运行旧软件的客户端不知道如何读取新格式.

这一切都相当复杂,我想知道我是否遗漏了什么?

谢谢

理查德

Tom*_*son 5

我使用类似于您的第二个选项的东西,但没有版本属性。

首先,尽量保持对易于向后兼容的事物的更改 - 更改主键是最坏的情况。

删除字段很容易 - 一旦所有服务器都运行不需要它的版本,就停止写入该字段。

添加字段要求您永远不要使用不会保存该字段的代码编写该对象。如果您不能一次在任何地方部署新版本,请在部署需要它的版本之前使用支持保存该字段的中间版本。

更改字段只是这两个操作的组合。

使用这种方法,根据需要应用更改 - 使用新版本写入,但允许使用新字段的默认值或派生值读取旧版本。

您可以使用相同的代码一次更新所有记录,尽管这可能不适用于大型数据集。

可以以相同的方式处理更改主键,但可能会变得非常复杂,具体取决于您使用的 nosql 系统。在这种情况下,您可能会坚持设计自定义迁移代码。