【问题标题】:complex queries in objectify对象化中的复杂查询
【发布时间】:2014-11-28 10:54:58
【问题描述】:

考虑一个更复杂的实体结构,例如

class Entity {
    Float valueA;
    Float valueB;
    List<Property> properties;
}

class Property {
    Long id;
    Float value;
}

我现在正在尝试找出一个索引结构来执行类似(伪 sql)这样的查询:

select entity where valueA >= x and valueB < y and properties contains
((id = a, value >= b) and (id = c, value = d))

我面临的问题是:

  • 我无法将多个不等式过滤器放在一个查询中。
  • 如何为列表属性对象添加约束

到目前为止,我脑海中浮现出一个想法:

我可以为所有属性使用关系索引模式。例如。创建以下实体:

class ValueA/ValueB {
   @Parent
   Key<Entity> parent;
   @Id
   Long id = 1L;
   @Index
   Float minValue;
}

并更改属性类,如

class Property {
    @Parent
    Key<Entity> parent;
    @Id
    Long id;
    @Index
    Float value;
}

然后我可以对每个相关的索引类进行查询,并保留那些符合所有条件的实体的父键。

这很难有效地完成,而且很容易变得非常昂贵。

我可以尝试其他解决方案吗?

提前致谢!

【问题讨论】:

  • 对于像这样的复杂查询,您最好对数据模型进行非规范化,或者拥有要过滤的属性的非规范化副本。也就是说,它还取决于您正在查看的数据集和结果集大小。例如,对于较小的结果集,也许您可​​以进行更简单的查询,然后在您的应用程序中进行进一步过滤?
  • 好吧,应用内数据处理和数据库过滤之间的平衡并不是我的问题范围。但是可以说数据集可能很大,我想尽可能多地进行数据库过滤。我不太确定如何以良好的方式对实体进行非规范化以适应上述查询。特别是如果有更多的列表属性。

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


【解决方案1】:

我会将我的实体的非规范化副本存储在 Search Api 中,这样可以进行更灵活的查询。

确保 Search Api 的结果包含实体的 ID。

最后,使用 Objectify 执行 keys() 查询以获取结果的实际实体。

【讨论】:

  • 绝对是一个值得花时间研究的想法!
猜你喜欢
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
相关资源
最近更新 更多