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

标签 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 设置为 TruevisibleFalse 并且 made_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)?

数字 1. 会得到很多不需要的结果,比如其他用户看不到的 Thing - 我认为这是对数据存储的多次读取? 2. 虽然是两个完整的查询,但也可能不必要地繁重,对吗?我仍在努力弄清楚与数据库进行何种交互会导致何种成本。

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

最佳答案

出于两个原因,第二名的财务状况会有所下降。首先,您为每次读取数据存储和查询中返回的每个实体付费,因此您将为必须读取所有数据和查询所有数据的第一个实体支付更多费用。第二种方式,您只需为需要的东西付费。

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

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

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

您将看到读取、写入和 Smalls 是如何添加到读取、写入和查询中的。

我也只查询当前用户拥有的那些,而不是 visible=false 和 owner=current,这样你就不需要复合索引,这会节省一些时间。您还可以使部分索引可见,这也节省了一些空间(仅在 true 时对其进行索引,假设您永远不需要查询 false 索引)。您将需要做一些小工作来删除重复项,但这可能还不错。

关于python - 多个查询与手动排序一个大型查询 (AppEngine NDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12678184/

相关文章:

google-app-engine - 如何在GAE中有效实现session?

google-app-engine - ndb 模型的 _post_put_hook 什么时候有不同于自己的 future ?

python - GAE ndb 按键(id)过滤

json - 将 ndb.Model 序列化为 JSON 的 App 引擎数据存储 to_dict 替代方案

python - "MySQL server has gone away"长时间空闲后出现错误

python - 带有 Python 的 MySQL 连接器 : getting data by field name

Python - select() 没有捕捉到损坏的套接字

python - tensorflow 中 numpy.newaxis 的替代方案是什么?

python - 读取上传的 zip 文件

spring - App Engine 和 Spring 安全 : Concurrent sessions