通过密钥获取与通过Google App Engine中的过滤器获取

时间:2012-04-15 17:21:16

标签: database google-app-engine

我希望尽可能高效并妥善规划。由于使用Google App Engine时读写成本很重要,因此我希望尽量减少这些费用。我不理解数据存储区中的“关键”概念。我想知道的是,通过其密钥获取实体会更有效率,考虑到我知道它是什么,而不是通过某种过滤器获取?

假设我有一个名为User的模型,并且用户有一个commentIds数组(列表)。现在我想得到所有这些用户的评论。我有两个选择:

  1. 用户的commentId数组是一个键数组,其中每个键都是Comment实体的键。由于我拥有所有密钥,因此我可以通过密钥获取所有评论。

  2. 用户的commentId数组是我自定义的标识符,在这种情况下,我们只是说它们是自动递增常规整数,并且数据存储区中的每个注释都有一个唯一的commentIntegerId。所以现在如果我想得到所有的评论,我会根据我的ID数组中ID的所有注释进行过滤提取。

  3. 哪种实施更有效,为什么?

2 个答案:

答案 0 :(得分:4)

  1. 按键获取是从数据存储区获取实体的最快方法,因为它是最直接的操作,不需要通过索引查找。
  2. 每次创建条目(除非您指定了key_name),应用引擎都会生成一个唯一的(每个父实体)数字ID,您应该将其用作评论的ID。

答案 1 :(得分:1)

您应该根据使用模式设计NoSql数据库(= GAE数据存储区):

如果您需要立即获取所有用户的评论,并且永远不需要根据某些条件(例如查询它们)获得其中一个或一些评论,而不是最有效方式,就速度而言和成本是将所有注释序列化为实体内的二进制blob(或将其保存到Blobstore)。

但我想情况并非如此,因为评论通常与用户和帖子有关,对吧?在这种情况下,上述建议是不可行的。

要回答标题问题:按键get总是比query更快一个属性,因为查询首先通过索引来满足属性条件,它获取键,然后它带有此密钥的get