对于像这样的模型:
class Thing(ndb.Model):
visible = ndb.BooleanProperty()
made_by = ndb.KeyProperty(kind=User)
belongs_to = ndb.KeyProperty(kind=AnotherThing)
基本上执行'或'查询,但比较不同的属性,所以我不能使用内置的OR ...我想得到所有Thing
(属于特定的AnotherThing
)哪个将visible
设置为True
或visible
为False
,made_by
为当前用户。
对数据存储区要求较低(即财务成本较低):
查询获取所有内容,即:Thing.query(Thing.belongs_to == some_thing.key)
并遍历结果,存储可见结果,以及那些不可见但由当前用户创建的结果?
查询以获取可见的内容,即: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,tasklets和memcache,以防相关。
答案 0 :(得分:3)
由于两个原因,第二名的财务状况将会减少。首先,您为查询中的每个数据存储读取和每个返回的实体付费,因此您将为第一个读取所有数据并查询所有数据的费用更高。第二种方式,你只需支付所需的费用。
其次,您还要支付后端或前端时间,并且您将使用时间在第一种方法中迭代所有结果,而您需要花费时间来使用第二种方法。
我看不出第一种选择更好的方法。 (也许如果你只有几个实体?)
要了解读取和查询的成本,请向下滚动一下: https://developers.google.com/appengine/docs/billing
您将看到如何将读取,写入和小写添加到读取,写入和查询中。
我也只是查询当前用户拥有的那些而不是visible = false和owner = current,这样你就不需要一个可以节省一些时间的复合索引。你也可以看到一个部分索引,这也节省了一些空间(只在索引时为true,假设你永远不需要查询错误的索引)。你需要做一些小工作来删除重复项,但这可能并不坏。
答案 1 :(得分:2)
您可能最好使用真实数据对这两种情况进行基准测试。抽象地确定这样的事情很难,因为有许多细微之处可能会影响整体表现。
我希望选项2更好。加载大量你不关心的对象只会给数据存储带来沉重的负担,我认为额外的查询不会与之相提并论。当然,这取决于有多少额外的东西等。