Google app engine 应用程序引擎数据存储-数据模型

Google app engine 应用程序引擎数据存储-数据模型,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我从几天前就开始使用appengine了。现在对我来说最重要的是数据建模,所以我对此有一些疑问。 假设我有一个简单的MyUser类。我还有一个Buddy类,看起来是这样的: @Entity public class Buddy { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Key id; private Date createAt; private MyUser user; privat

我从几天前就开始使用appengine了。现在对我来说最重要的是数据建模,所以我对此有一些疑问。 假设我有一个简单的
MyUser
类。我还有一个
Buddy
类,看起来是这样的:

@Entity
public class Buddy {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Key id;
  private Date createAt;
  private MyUser user;
  private Key buddyOf;
}
在这个类中,我有
MyUser
字段,因为每个好友都是一个用户,我有buddyOf字段,因为有另一个MyUser的好友列表中有这个好友。 问题是,如果我从数据存储中得到一个示例buddy,我也会得到这个
MyUser
?如果是,在
MyUser
类中将嵌入另一个
实体
,并在该
实体
中再嵌入一个,等等。。。?也许我应该只将
字段保存到其他实体? 主要问题是我应该如何在数据存储中存储数据?我应该使用合成并在其他对象中包含对象?如果是,那么对象中的对象在对象中的对象等。。。
最好的方法是什么?

数据存储对象模型设计应该不同于通常用于关系数据库的设计。您应该检查受支持类型的属性。没有对象作为属性类型。您仍然可以使用嵌入式注释,但对于您的案例来说,这不是最好的方法


您应该为用户存储密钥甚至ID作为引用。它将使实例变小,并解决您描述的问题。但您将无法实现引用完整性。这是NoSQL设计的一个限制。

我认为您正在建模一个n:m关系。您可以创建如下结构:

  • 对于每个MyUser实体,它都有一组元素类型为Buddy的实体(该组表示此MyUser实体的所有伙伴)
  • 每个好友实体都有MyUser实体作为其祖先
  • 每个好友实体通过包含一个字段来表示所有者MyUser和另一个MyUser对象之间的关系:另一个MyUser的id
因此,使用数据存储,以下操作变得简单自然:

  • 向MyUser实体添加/删除好友(只需添加/删除新的子好友实体)
  • 查询MyUser实体的所有好友(列出所有子项)
这种结构具有gae数据存储高可用性的几个优点。例如,如果将好友(子实体)添加到MyUser实体,则可以立即查询它们,因为它们位于同一实体组中(您总是可以毫不延迟地看到一致的数据)