" SQL Group By" Google Cloud Platform数据存储的替代方案

时间:2016-02-21 14:52:28

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

假设以下是我在Google云平台上的数据存储内容:

enter image description here

class ItemRecord {
    @Id
    private
    Long id;

    @Index
    private String item;
    @Index
    private String user;
    @Index
    private int minValue;
    @Index
    private int maxValue;
}

我希望得到minValue组的maxValueitem值的最小值:

item1 minumum_minValue= 1, maximum_maxValue= 13
item2 minumum_minValue= 3, maximum_maxValue= 10

注意: minValue和maxValue属性是可更新的(实体是用户给定的值,用户可以随时更新这些属性)所以请考虑更新,删除操作建议使用单独的实体存储最小值minValue和最多maxValue值。

我正在寻找类似sql:

的内容
SELECT item, MAX(maxValue)
FROM [ItemRecord]
Group by item

SELECT item, MIN(minValue)
FROM [ItemRecord]
Group by item

但数据存储不支持" group by"操作,我找不到类似的东西。

那么,我是如何解决这个问题的?

1)获取不同的项目名称:

private static List<String> getDistinctItemNameList() {
    Query query = ofy().load().type(ItemRecord.class)
            .project("item").distinct(true);
    List<ItemRecord> resultList = query.list();

    if(resultList != null && !resultList.isEmpty()) {
        List<String> itemNameList = new ArrayList<>(resultList.size());
        for (ItemRecord itemRecord : resultList) {
            itemNameList.add(itemRecord.getItem());
        }
        return itemNameList;
    }
    return null;
}

2)对于每个itemName(在上面检索)查询数据存储区的最小minValue和最大maxValue:

private ItemRecord getMinumumMinValue(String itemName) {
    ItemRecord record = ofy()
            .load()
            .type(ItemRecord.class)
            .filter("item", itemName)
            .order("minValue")
            .first().now();

    return record;
}

private ItemRecord getMaximumMaxValue(String itemName) {
    ItemRecord record = ofy()
            .load()
            .type(ItemRecord.class)
            .filter("item", itemName)
            .order("-maxValue")
            .first().now();

    return record;
}

费用(用于检索不同商品名称的查询)+(不同商品数*最小minValue查询)+(不同商品数*最大maxValue查询)

但是这个解决方案因其许多读取操作而非常烦人。你有什么建议,更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

数据存储区是分析查询的糟糕工具。将您的数据子集复制到Cloud SQL或其他可以轻松运行聚合的关系存储中。

相关问题