App Engine数据存储 - 数据模型

时间:2012-10-08 20:11:33

标签: google-app-engine google-cloud-datastore

我正在使用App Engine几天。对我来说最重要的是建模数据,所以我对此有一些疑问。 假设我有简单的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在他的好友列表中有这个好友。 问题是如果我从Datastore获得一个样本伙伴,我也得到这个MyUser?如果是,那么在MyUser课程中将嵌入另一个Entity并在Entity中再嵌入一个等等...?也许我应该只将Key字段保留给其他实体? 主要问题是我应该如何在数据存储中存储数据?我应该使用合成并在其他对象中包含对象?如果是,对象中的对象等等... 什么是最好的方法?

2 个答案:

答案 0 :(得分:1)

DataStore对象模型设计应该与通常用于关系数据库的设计不同。您应该检查属性的受支持类型https://developers.google.com/appengine/docs/java/datastore/entities#Properties_and_Value_Types没有对象作为属性类型。您仍然可以使用嵌入式注释,但它不适合您的情况。

您应该为用户存储密钥或甚至ID作为参考。它会使实例变小并解决您描述的问题。但是你无法达到参考完整性。这是NoSQL设计的限制。

答案 1 :(得分:1)

我认为你正在建立一个n:m关系。您可以创建这样的结构:

  • 对于每个MyUser实体,它有一组元素类型为Buddy的实体(该组代表此MyUser实体的所有伙伴)。
  • 每个Buddy实体都将MyUser实体作为其祖先。
  • 每个Buddy实体通过包含一个字段来表示所有者MyUser与另一个MyUser对象之间的关系:另一个MyUser的id

因此,使用数据存储区可以轻松自然地进行以下操作:

  • 向MyUser实体添加/删除好友(只需添加/删除新的子Buddy实体)
  • 查询MyUser实体的所有好友(列出所有孩子)

这种结构与gae-datastore高重放有几个好处。例如,如果您将一个伙伴(子实体)添加到MyUser实体,则可以立即查询它们,因为它们位于同一个实体组中(您总是看到一致的数据而没有延迟)。