【问题标题】:When do you store ids and when do you store keys in gae datastore?您什么时候存储 ids 以及何时将密钥存储在 gae 数据存储中?
【发布时间】:2016-01-16 19:54:53
【问题描述】:

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

@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;

}

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

只是想知道在其他实体不是父实体时存储对其他实体的引用的最佳做法是什么 - 您应该存储 id 并稍后生成密钥,还是只存储实体的密钥。有充分的理由为什么你可能会做一个而不是另一个?

编辑:由于我使用的是 Cloud Endpoints,因此我从 AppEngine 项目中获得的响应是​​ JSON。客户端库中不允许使用参数化类型的密钥。所以对我来说,id 可以工作,Key&lt;?&gt; 也可以工作。请注意,您应该使用以下方式将网络安全版本返回给您的客户端:

myKey.getString();

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复!我使用谷歌应用引擎,在我上面的例子中,GAE 可能正在做你所说的:在存储实体时从子实体键中提取父 ID。
    • 旁注的另一个问题:对于您的各种 API 方法,您是更喜欢使用实体作为参数并在 API 方法中获取其 ID,还是仅将相关 ID 作为参数传入?例如,你会做类似insertComment(User user, Comment comment)insertComment(@Named("userId")Long userId, Comment comment) 的事情吗?
    • 这取决于:) 如果我需要来自该实体的更多信息并且我已经拥有它,我会通过它。如果我还没有,我将传递一个 ID 并在方法中检索它。
    • 我想跟进这个问题,问你是否知道 Key 在数据存储区中占用了多少空间与 Id 相比?
    • 所有键都不同,因为它们由种类和 ID/名称组成,包括所有祖先。我想我们说的是数百字节的密钥与 8 字节的 ID,但很大程度上取决于数据存储区的内部实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2011-12-15
    • 2017-12-28
    相关资源
    最近更新 更多