【发布时间】: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