【问题标题】:How do implement schema changes in a NOSQL storage system如何在 NOSQL 存储系统中实现模式更改
【发布时间】:2011-08-30 05:42:11
【问题描述】:

当您使用像 SimpleDB 这样的 Nosql 存储时,如何管理主要的架构更改?

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

使用 SQL 数据库,您可以在客户端软件部署过程中运行一组 sql 语句。显然,这不适用于像 SimpleDB 这样的东西

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

我想到的一些解决方案是

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

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

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

谢谢

理查德

【问题讨论】:

    标签: nosql amazon-simpledb


    【解决方案1】:

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

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

    删除一个字段很容易 - 只需在所有服务器都运行不需要它的版本后停止写入该字段即可。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      RavenDB 另一个 NoSQL 数据库使用迁移来实现这一目标

      http://ayende.com/blog/66563/ravendb-migrations-rolling-updates

      http://ayende.com/blog/66562/ravendb-migrations-when-to-execute

      通常,这些类型的更改由您的应用程序处理,该应用程序会在加载版本 X 并转换为版本 Y 并持久化时将架构更改为较新的架构

      【讨论】:

        猜你喜欢
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 1970-01-01
        相关资源
        最近更新 更多