我正在使用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
字段保留给其他实体?
主要问题是我应该如何在数据存储中存储数据?我应该使用合成并在其他对象中包含对象?如果是,对象中的对象等等...
什么是最好的方法?
答案 0 :(得分:1)
DataStore对象模型设计应该与通常用于关系数据库的设计不同。您应该检查属性的受支持类型https://developers.google.com/appengine/docs/java/datastore/entities#Properties_and_Value_Types没有对象作为属性类型。您仍然可以使用嵌入式注释,但它不适合您的情况。
您应该为用户存储密钥或甚至ID作为参考。它会使实例变小并解决您描述的问题。但是你无法达到参考完整性。这是NoSQL设计的限制。
答案 1 :(得分:1)
我认为你正在建立一个n:m关系。您可以创建这样的结构:
因此,使用数据存储区可以轻松自然地进行以下操作:
这种结构与gae-datastore高重放有几个好处。例如,如果您将一个伙伴(子实体)添加到MyUser实体,则可以立即查询它们,因为它们位于同一个实体组中(您总是看到一致的数据而没有延迟)。