2012-10-08 95 views
0

自从几天以来,我正在使用App Engine。对我来说最重要的是对数据进行建模,所以我对此有一些疑问。 假设我有简单的MyUser类。我有Buddy类以及它看起来像这样:App Engine数据存储 - 数据模型

@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字段给其他实体? 主要问题是我应该如何将数据存储在数据存储中?我应该使用构图并在其他对象内部有对象?如果是的话,对象中的物体等等...... 什么是最好的方法?

回答

1

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

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

1

我想你是建模一个n:m的关系。可以创建这样的结构:

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

所以下面的操作变得容易和自然与数据存储:

  • 添加/删除好友的MYUSER实体(只需添加/删除新的子好友实体)
  • 查询所有好友的MYUSER实体(列表中的所有儿童)

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

相关问题