您何时存储ID以及何时将密钥存储在gae数据存储区中?

时间:2016-01-16 19:54:54

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

假设我的数据存储区模型如下所示:

@Entity
public class User {

    @Id
    private Long id;
    @Index
    private String email;
    private Long dateOfBirth;
    // More fields...
}

@Entity
public class Topic {

    @Id
    private Long id; 
    private String topicTitle;
    private Long date; 

}

@Entity
public class Comment {

    @Id
    private Long id;
    @Parent
    private Key<Topic> topicKey;
    private Long commenterId;
    private String text;
    private Long date;

}

实体注释具有父实体主题。我知道在指定@Parent时应该存储密钥,就像我在Comment实体中所做的那样,但是还应该存储commenterId的密钥吗?或者是否足够存储该用户的Long id?

只是想知道在不是父项的情况下存储对其他实体的引用的最佳做法是什么 - 如果您存储id并稍后生成密钥或者只是将密钥存储到实体中。是否有充分理由说你可以做另一个?

编辑:由于我使用的是Cloud Endpoints,因此我从AppEngine项目获得的响应是​​JSON。客户端库中不允许使用参数化类型的Key。所以对我来说,id可以工作,Key<?>也可以工作。请注意,您应该使用以下命令将webafe版本返回给客户:

myKey.getString();

1 个答案:

答案 0 :(得分:1)

通常没有理由将密钥存储为参考。密钥占用更多空间 - 无论是在数据存储区中,还是在与客户端进行传输的对象中。

仅当相同的实体种类可以是其本身或另一个实体的子节点时,可能需要使用密钥。这在技术上是可行的,一些数据模型可以使用这种方法,尽管它可能是一个非常罕见的用例。

注意:我只在对象中使用父对象的ID - 出于同样的原因(较少的空间)。在数据存储区实体中,始终可以从子实体键中提取父ID。我使用低级数据存储API,但是 - 您需要检查如何在您使用的库中正确注释子父关系。