我希望尽可能高效并妥善规划。由于使用Google App Engine时读写成本很重要,因此我希望尽量减少这些费用。我不理解数据存储区中的“关键”概念。我想知道的是,通过其密钥获取实体会更有效率,考虑到我知道它是什么,而不是通过某种过滤器获取?
假设我有一个名为User的模型,并且用户有一个commentIds数组(列表)。现在我想得到所有这些用户的评论。我有两个选择:
用户的commentId数组是一个键数组,其中每个键都是Comment实体的键。由于我拥有所有密钥,因此我可以通过密钥获取所有评论。
用户的commentId数组是我自定义的标识符,在这种情况下,我们只是说它们是自动递增常规整数,并且数据存储区中的每个注释都有一个唯一的commentIntegerId。所以现在如果我想得到所有的评论,我会根据我的ID数组中ID的所有注释进行过滤提取。
哪种实施更有效,为什么?
答案 0 :(得分:4)
答案 1 :(得分:1)
您应该根据使用模式设计NoSql数据库(= GAE数据存储区):
如果您需要立即获取所有用户的评论,并且永远不需要根据某些条件(例如查询它们)获得其中一个或一些评论,而不是最有效方式,就速度而言和成本是将所有注释序列化为实体内的二进制blob(或将其保存到Blobstore)。
但我想情况并非如此,因为评论通常与用户和帖子有关,对吧?在这种情况下,上述建议是不可行的。
要回答标题问题:按键get
总是比query
更快一个属性,因为查询首先通过索引来满足属性条件,它获取键,然后它带有此密钥的get
。