【问题标题】:Data/Object Consistency in noSQL databasenoSQL 数据库中的数据/对象一致性
【发布时间】:2018-02-04 05:11:54
【问题描述】:

我在开发一个相当大的项目时遇到了一个问题。假设我将一个对象存储在 no-sql db 中,例如 Google Cloud Datastore,但随后我向此类添加了一个新字段,然后一旦我进行查询并获取此对象,新字段的值将是什么?它是否取决于序列化程序或数据库或编程语言? 例如在java中:

public class Car{
   private int numOfDoors;
   public Car(int nod){
       numOfDoors = nod;
   }
}

然后我将对象 car1 保存到 Datastore,但之后我更新了我的代码。

public class Car{
    private int numOfDoors;
    private Set<String> tags;
    private boolean condition;
    public Car(int nod, Set<String> tags, boolean cod){
         numOfDoors = nod;
         this.tags = tags;
         condition = cod;
    }
    public Set<String> getTags(){
         return tags;
    }
}

如果我刚刚更新代码并调用 get 到刚刚从 Datastore 获取的对象时调用 getTags() 会发生什么? 如果标签和条件不在构造函数中怎么办?喜欢:

private Set<String> tags = new HashSet<>();

删除一个字段呢? 谢谢!

【问题讨论】:

  • 这取决于特定的后端以及您用来访问它的库/工具。大多数情况下,您会在 Java 类中获得默认值。
  • “它是否取决于序列化程序或数据库或编程语言?” - 可能,所有这些。如果您想要一个有用的答案,您将需要更具体。但是,有一个基本原则:没有魔法。如果某些东西似乎需要一个神奇的实现,那么它可能不受支持。
  • 阅读this article。它是关于 Python 的,但它让您了解在 Datastore 中更新架构时会发生什么

标签: java google-app-engine nosql google-cloud-datastore consistency


【解决方案1】:

在谷歌云文档的Defining Data Classes with JDO,特别是Object Fields and Entity Properties部分,是这样解释的:

如果数据存储实体被加载到对象中并且没有 对象字段之一的属性,并且该字段的类型是 可为空的单值类型,该字段设置为空。当对象 保存回数据存储区时,null 属性在 数据存储为空值。如果该字段不是可为空的值 类型,加载没有相应属性的实体会引发 异常……

所以基本上修改后的类中新添加的属性将设置为null,因为保存的实体没有它们。

【讨论】:

    猜你喜欢
    • 2012-05-08
    • 2015-01-09
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多