NoSQL DB上的查询问题中的聚集函数,缺少类型,熵
虽然我们相信NoSQL数据库已经填补了RDBMS方面存在的一些挑战,但是随着时间的推移,我们在查询生态系统领域面临着NoSQL DB的挑战。
例如Couchbase,就像其母亲CouchDB在使用视图,列表,密钥查找,映射缩减等读取数据方面已经有了重大改进.Couchbase甚至已经转向为其巨大的2.X verson创建一个类似于SQL的查询引擎。 MongoDB也做出了严重的改进,并且可能会有复杂的查询以及许多其他的NoSQL DB开发。
大多数NoSQL DB可以执行基于LOGICAL and COMPARISON OPERATORS
复杂查询,例如AND
, OR
, ==
等。但是,对数据进行aggergation和执行复杂关系是我的问题。 例如,在CouchDB和/或Couchbase中,视图只能跨越单个数据库。 编写一个视图可以汇总来自两个或更多数据库的数据,这是不可能的。
现在让我解决这个问题。 函数(无论是否合并): AVG
, SUM
, ROUND
, TRUNC
, MAX
, MIN
等缺乏数据类型使得无法高效地处理日期和时间,因此缺少日期和时间函数,例如TO_DATE
, SYSDATE
(for系统日期/时间), ADD_MONTHSs
, DATE BETWEEN
, DATE/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数据库中缺少FUNCTIONS
和DATA 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