3

对于像这样的模型:

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

本质上执行“或”查询,但比较不同的属性,所以我不能使用内置的 OR... 我想获取所有Thing(属于特定的AnotherThing)已经visible设置为Truevisible现在是当前用户的用户Falsemade_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其他用户的不可见 s - 我认为这是对数据存储的多次读取?2.虽然是两个完整的查询,这也可能是不必要的繁重,对吧?我仍在尝试找出与数据库的何种交互会导致何种成本。

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

4

2 回答 2

3

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

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

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

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

您将看到 Read、Writes 和 Smalls 是如何为读取、写入和查询相加的。

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

于 2012-10-01T20:15:33.710 回答
2

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

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

于 2012-10-01T17:48:49.513 回答