- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
可以在 GAE/J 上部署同一应用程序的多个版本,但 GAE/J 如何处理不同版本可以使用不同数据存储(并且可能不兼容)方案这一事实?
示例:
假设在我的应用程序的版本 1 上有一个类似 POJO(为了简单起见,我省略了几个细节):
public class User {
private String key;
private String username;
private Integer phoneNumber;
}
现在假设在版本 2 上我想使用:
public class User {
private String key;
private String username;
// on this version, replaced 'phoneNumber' by:
private String eMail;
}
现在两个问题:
如果我在 GAE/J 中部署两个版本,我会在数据存储中看到什么模式?
数据本身呢?如果我在版本 2 上添加用户,我会在版本 1 的数据存储上看到它的数据吗?
最佳答案
引用 the docs ,
Unlike relational databases, the App Engine datastore does not require that all entities of a given kind have the same properties. The application can specify and enforce its data model using libraries included with the SDK, or its own code.
这也被称为“软模式”——数据存储并不真正做模式,但您可以或多或少地通过应用程序级代码(您的自己的,或在图书馆)。
因此,如果您(通过库或在您自己的代码中)强制执行“此属性必须存在”的约束,而某个实体实际上并不具有该属性(因为它是基于不同的“插入的” soft schema”,例如不同版本的应用程序),那么在检查约束时,您将得到应用程序级代码或库选择用来指示违反此软约束的任何异常。
如果您没有表达此类约束,那么缺少的属性将具有您的代码或库提供的默认值,或者是“默认默认值”,我认为这通常是 null
Java 或 Python 中的 None
。
请注意,不同版本的应用程序可能使用不同的运行时(有些可能是 Java,有些可能是 Python)并且不同的运行时仍然使用相同的数据存储,因此 Java 与 Python 的区别是此处不重要。
在您的特定示例中(没有提供默认值,也没有关于强制存在的断言)我希望从任一版本添加用户将使它从另一个版本可见,缺少的属性被视为 null
(但可能存在我不知道的约束,在这种情况下,当库试图验证这些约束并发现它们被违反时,应该会产生异常)。
一般来说,我不会担心添加“可选”属性(那些可能合法地丢失/null
/None
,或者在那些中有明确的默认值例,以便旧版本编写的实体仍然可以正确读取),但是其他类型的更改(使以前丢失的或可选的属性成为强制性的,添加其他约束等)可能需要某种形式的“数据库迁移”(也许通过安全数据连接器)或“应用程序级别的 hacks for legacy compatibility”(如果迁移不可行)。
迁移可能不可行,特别是如果您需要能够回滚到以前的应用程序版本,例如(实际上在这些情况下其他操作会出现问题,例如删除约束与添加约束一样有问题,因为旧的版本可能无法处理在新版本中输入的数据,这些数据违反了已在新版本中删除的约束)。
所以这在实践中不一定是一个简单的问题,但这样想仍然有帮助:数据存储本身没有架构,只有我的应用程序和/或它选择使用的库强制执行所需的任何约束底层实体上的应用程序级别,本质上,每个实体实际上都具有一组任意属性——“软模式”、应用程序级模式、底层数据层中没有“实际”模式。
关于java - Datastore 和 App 版本如何在 GAE/J 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1055075/
我是一名优秀的程序员,十分优秀!