【问题标题】:When using an object database, how do you handle significant changes to your object model?使用对象数据库时,您如何处理对象模型的重大更改?
【发布时间】:2011-04-05 17:38:45
【问题描述】:

如果您使用对象数据库,当您需要更改对象模型的结构时会发生什么?

例如,我正在使用 Google App Engine。在开发应用程序时,我意识到在某些情况下,我错误地命名了一个类,我想更改名称。我认为我需要巩固两门课程。

但是,我不认为我可以,因为类的名称直观地与数据存储相关联,并且在这些类名称下存储了实际数据。

我认为从数据存储中抽象出对象模型的“旧方法”的好处在于,数据存储对对象模型一无所知——它只是数据。因此,您可以更改对象模型并以不同的方式从数据存储中加载数据。

所以,一般来说,当使用与您的数据模型密切相关的数据存储时......您如何改变周围的事物?

【问题讨论】:

    标签: google-app-engine nosql objectdatasource


    【解决方案1】:

    如果您只关心类命名,您可以在不更改种类(数据存储区中使用的标识符)的情况下更改类名:

    class Foo(db.Model):
      @classmethod
      def kind(cls):
        return 'Bar'
    

    如果你想重命名你的类,只需实现上面的kind() 方法,让它返回旧的类名。

    如果您需要更改数据存储中数据的实际表示,则必须运行 mapreduce 来更新旧数据。

    【讨论】:

      【解决方案2】:

      与在关系数据库中执行此操作的方式相同,只是没有一个漂亮的简单 SQL 脚本:http://code.google.com/appengine/articles/update_schema.html

      此外,就像过去一样,没有属性的对象不会自动获得默认值,并且架构中不存在的属性仍然作为对象中的幻象存在。

      要重命名属性,我希望您可以删除旧属性(幻影挂起)添加新名称,使用旧(幻影)属性的副本填充数据。重写的对象将只有新的属性

      【讨论】:

        【解决方案3】:

        您也许可以按照我们在项目中的方式进行操作:

        在我们更新对象模型(模式)之前,我们使用自定义导出函数和顶部的版本标签将数据导出到 json 格式的文件或 blob。模式更新后,我们使用另一个自定义函数导入 json,该函数创建新实体并用旧数据填充它们。当然导入版本需要知道每个版本号对应的json格式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-25
          • 1970-01-01
          相关资源
          最近更新 更多