使用“非IN”替代逻辑的Google App Engine JDO查询

时间:2011-09-28 14:24:24

标签: java google-app-engine google-cloud-datastore jdo

我正在开发一个Google App Engine Java应用程序,用户可以根据搜索条件从数据库中搜索业务对象。 搜索结果(记录列表)不应包括过去搜索中的任何记录(特定数量的记录,比如100)。因此,我将过去的结果存储在用户配置文件中。 有效实现此逻辑的任何建议(不使用多个集合迭代)。我正在使用JDO,并且在查询中使用“NOT IN”条件存在限制。

1 个答案:

答案 0 :(得分:1)

这是一个解决方案,假设您的目标是获得200个已经不在历史记录中的密钥。 我将尝试估算用作“效率”代理的操作数量,因为这是我们在new pricing model中收费的方式

  1. 获取用户对象和“历史记录键”(1次读取操作)
  2. 只执行密钥查询并获取300条记录。 (300个小型企业)
  3. 在您的代码中,从300条记录中减去任何历史记录键。 (0次操作)
  4. 如果您在步骤3之后最终得到的记录少于200条,则再获取100条记录。(必要时重复)(100次小操作)。
  5. 如果您有200个之前未见过的密钥,则可以在需要时获取完整的业务对象实体,或者向用户显示密钥。 (如果你获取整个对象,则读取200次操作)
  6. 如果数据存储区支持本机“NOT IN”运算符,那么我们可以从第2步中删除100个小操作,并跳过第4步。这里最大的成本将是获取实际的200个实体,这必须发生在或没有NOT IN运算符。最终,与本机NOT IN运算符相比,这种方法效率不高。

    进一步优化:

    • 如果您不需要同时显示200个密钥,那么您可以使用游标一次只获得N个结果。

    • 我只是猜测我什么时候建议您先获得300个密钥。您可能需要或多或少。第二次尝试也可能少于100。