NoSQL DB上的查询问题中的聚集函数,缺少类型,熵

虽然我们相信NoSQL数据库已经填补了RDBMS方面存在的一些挑战,但是随着时间的推移,我们在查询生态系统领域面临着NoSQL DB的挑战。

例如Couchbase,就像其母亲CouchDB在使用视图,列表,密钥查找,映射缩减等读取数据方面已经有了重大改进.Couchbase甚至已经转向为其巨大的2.X verson创建一个类似于SQL的查询引擎。 MongoDB也做出了严重的改进,并且可能会有复杂的查询以及许多其他的NoSQL DB开发。

大多数NoSQL DB可以执行基于LOGICAL and COMPARISON OPERATORS复杂查询,例如ANDOR==等。但是,对数据进行aggergation和执行复杂关系是我的问题。 例如,在CouchDB和/或Couchbase中,视图只能跨越单个数据库。 编写一个视图可以汇总来自两个或更多数据库的数据,这是不可能的。

现在让我解决这个问题。 函数(无论是否合并): AVGSUMROUNDTRUNCMAXMIN等缺乏数据类型使得无法高效地处理日期和时间,因此缺少日期和时间函数,例如TO_DATESYSDATE (for系统日期/时间), ADD_MONTHSsDATE BETWEENDATE/TIME format Conversion等等的确如此,很多人会说,他们缺乏Schema,类型和东西,但是,我发现自己并没有逃避至少需要其中列出的功能之一。 例如,因为NoSQL DB没有日期/时间数据类型,所以很难根据这些数据类型执行查询,因为您可能想要根据时间来分析趋势。 另外,其他人也试图使用UNIX / EPOC时间戳和东西来解决这个问题,但它不是一个single size fits all解决方案的解决方案。

Map Reduce可以用来达到某个(小)程度的聚合,但是开销已经被认为是很棒的。 但是,缺少GROUP BY功能使得它成为一个紧凑的解决方案来过滤所需的内容。 看下面的查询:

SELECT 
doc.field1, doc.field3, SUM(doc.field2 + doc.field4)
FROM 
couchdb.my_database 
GROUP BY doc.field1, doc.field3 
HAVING SUM(doc.field2 + doc.field4) > 20000;

在CouchDB或Couchbase上这不是很容易实现。 我不确定它是否可能在MongoDB上。 我希望可以开箱即用。 这使得NoSQL难以用作数据仓库或OLTP / OLAP解决方案。 我发现,每次需要进行复杂的分析时,都需要通过分页不同的数据集在中间件中完成。 现在,大多数有经验的人(例如CLOUDANT )都调整了LUCENE来执行复杂的查询,但因为它最初是用于索引和文本搜索的,所以它并没有解决大多数NoSQL数据库中缺少FUNCTIONSDATA AGGREGATION问题。

由于缺少FUNCTIONS ,大多数NoSQL DB都具有NULL数据类型,但缺少将NULL对象转换为其他内容的选项,如在某些RDBMS中。 例如在Oracle中,我可以: NVL(COLUMN,0)为了包含所有行,同时对给定列执行AVG计算(因为默认情况下,空列不会被计入/包含在查询处理中)。

为了完全理解这个问题,例如CouchDB视图在如下所示的文档范围内运行:

function(doc){
    // if statements, logical operators, comparison operators
    // e.t.c here. until you do am emit of that doc
    // if it satisfies the conditions set
    // emit(null, doc) OR emit(doc.x,[doc.y, doc.z]) e.t.c.
    // you can only emit javascript data types anyways
    emit(doc.field1,doc)
}
满足过滤器的文档可以通过并进入下一个阶段或减少功能。 想象一下如下的文档结构:

{
    x: '',
    y: '',
    z: {
        p: '',
        n: N    // integer or number data type        
    },
    date: 'DD/MON/YYYY'  // date format
}

现在,让我们想象一下这种查询的可能性:

function(){
    var average = select AVG(doc.z.n) from couchdb.my_database;
    var Result = select doc.x,doc.y from couchdb.my_database where 
            doc.z.n > average and doc.y = 'some string' and 
            doc.date between '01-JUN-2012' and '03-AUG-2012';
    emit(Result);
}

或者如果这个查询是可能的:

function(){
    var latest = select MAX(doc.date) from couchdb.my_database;
    var Result  = select 
                    doc.x,doc.z.p,MONTHS_BETWEEN(doc.date,latest) as "Months_interval" 
                    from couchdb.my_database where doc.y like '%john%' 
                    order by doc.z.p;
    emit(Result);
}
问题1:哪种NoSQL数据库解决方案在很大程度上已经达到了,上面详细讨论了查询能力? 什么样的关键特征使其脱颖而出?

Qn 2:是否缺少Schema,或者是Key-Value的特征是缺乏查询这些数据库FUNCTIONS的原因? 在大多数NoSQL数据库中缺乏聚合功能的原因是什么?

Qn 3:如果上面的查询能力在任何NoSQL数据库中都是可能的,那么使用现有的NoSQL基础结构可以获得上述最后两(2)个查询问题(考虑您选择的任何NoSQL技术)


MongoDB有一个叫做Aggregation Framework的东西,它工作得很好。 我会说几乎所有的SQL Aggregation查询都可以在这个框架中执行。 这里有一些从SQL到Aggregation Framework的“转换”的例子。

无论如何,MongoDB是一个面向文档的数据库,而不是像CouchDB那样的键值,所以我不知道它是否符合您的要求。

链接地址: http://www.djcxy.com/p/66411.html

上一篇: Aggregate functions, Lack of Types, Entropy in Query problems on NoSQL DBs

下一篇: Can NoSQL (e.g. MongoDB) replace Data Grid solutions e.g. Oracle Coherence