多个查询与手动排序一个大型查询(AppEngine NDB)

时间:2012-10-01 17:37:38

标签: python google-app-engine app-engine-ndb

对于像这样的模型:

class Thing(ndb.Model):
    visible = ndb.BooleanProperty()
    made_by = ndb.KeyProperty(kind=User)
    belongs_to = ndb.KeyProperty(kind=AnotherThing)

基本上执行'或'查询,但比较不同的属性,所以我不能使用内置的OR ...我想得到所有Thing(属于特定的AnotherThing)哪个将visible设置为TruevisibleFalsemade_by为当前用户。

对数据存储区要求较低(即财务成本较低):

  1. 查询获取所有内容,即:Thing.query(Thing.belongs_to == some_thing.key)并遍历结果,存储可见结果,以及那些不可见但由当前用户创建的结果?

  2. 查询以获取可见的内容,即:Thing.query(Thing.belongs_to == some_thing.key, Thing.visible == "True")并单独查询以获取当前用户的不可见内容,即:Thing.query(Thing.belongs_to == some_thing.key, Thing.visible == "False", Thing.made_by = current_user)

  3. 数字1.会得到许多不必要的结果,比如其他用户的不可见Thing - 我认为这是数据存储的许多读取? 2.虽然是两个完整的查询,也可能是不必要的重,对吧?我还在尝试弄清楚与数据库的哪种交互会导致什么样的成本。

    我在必要时使用ndb,tasklets和memcache,以防相关。

2 个答案:

答案 0 :(得分:3)

由于两个原因,第二名的财务状况将会减少。首先,您为查询中的每个数据存储读取和每个返回的实体付费,因此您将为第一个读取所有数据并查询所有数据的费用更高。第二种方式,你只需支付所需的费用。

其次,您还要支付后端或前端时间,并且您将使用时间在第一种方法中迭代所有结果,而您需要花费时间来使用第二种方法。

我看不出第一种选择更好的方法。 (也许如果你只有几个实体?)

要了解读取和查询的成本,请向下滚动一下: https://developers.google.com/appengine/docs/billing

您将看到如何将读取,写入和小写添加到读取,写入和查询中。

我也只是查询当前用户拥有的那些而不是visible = false和owner = current,这样你就不需要一个可以节省一些时间的复合索引。你也可以看到一个部分索引,这也节省了一些空间(只在索引时为true,假设你永远不需要查询错误的索引)。你需要做一些小工作来删除重复项,但这可能并不坏。

答案 1 :(得分:2)

您可能最好使用真实数据对这两种情况进行基准测试。抽象地确定这样的事情很难,因为有许多细微之处可能会影响整体表现。

我希望选项2更好。加载大量你不关心的对象只会给数据存储带来沉重的负担,我认为额外的查询不会与之相提并论。当然,这取决于有多少额外的东西等。