0

几天以来,我一直在使用 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也许我应该只将字段保留给其他实体?主要问题是我应该如何在数据存储中存储数据?我应该使用组合并且在其他对象中有对象吗?如果是的话,对象中的对象等等……最好的方法是什么?

4

2 回答 2

1

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

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

于 2012-10-09T00:53:31.263 回答
1

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

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

因此,数据存储区的以下操作变得简单而自然:

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

这种结构对 gae-datastore high replaca 有几个好处。例如,如果您将好友(子实体)添加到 MyUser 实体,则可以立即查询他们,因为他们在同一个实体组中(您总是可以毫不拖延地看到一致的数据)。

于 2012-10-09T03:06:57.077 回答