虽然我们认为NoSQL数据库已经填补了一些在RDBMS方面具有挑战性的差距,但随着时间的推移,我在其查询生态系统领域遇到了一些NoSQL DB的挑战。
例如Couchbase,就像其母CouchDB在使用视图,列表,键查找,map reduce,e.t.c读取数据方面有了重大改进。对于他们庞大的2.X版本,Couchbase甚至moved to create和SQL-like query engine。 MongoDB也做了很多改进,并且可以在其上进行复杂的查询以及许多其他的NoSQL DB开发。
大多数NoSQL DBs can perform Complex queries基于LOGICAL and COMPARISON OPERATORS
,例如AND
,OR
,==
e.t.c然而,对我来说,混淆和执行复杂的数据关系是一个问题。例如,在CouchDB和/或Couchbase中,视图仅跨越一个DB。不可能编写一个汇总来自两个或多个数据库的数据的视图。
现在让我解决这个问题。函数(无论是否聚合):AVG
,SUM
,ROUND
,TRUNC
,MAX
,MIN
等缺少数据类型使得无法有效地使用日期和时间因此缺乏日期和时间功能,例如TO_DATE
,SYSDATE
(系统日期/时间),ADD_MONTHSs
,DATE BETWEEN
,DATE/TIME format Conversion
e.t.c.确实,许多人会说,他们缺乏架构,类型和东西,但是,我发现自己并没有逃避至少需要在其中列出的任何一个功能。例如,由于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
来执行复杂的查询,但由于它最初用于索引和文本搜索,因此它没有解决FUNCTIONS
和大多数NoSQL DB上的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) }满足过滤器的文档将通过并进入下一阶段或减少功能。想象一下这样的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); }Qn 1: NoSQL数据库解决方案在很大程度上取得了哪些成果,在上面的细节中讨论了查询功能?哪些关键功能让它脱颖而出?
Key-Value
是否缺少FUNCTIONS
的特征?在大多数NoSQL DB中缺少聚合功能的原因是什么?
答案 0 :(得分:1)
MongoDB有一个名为Aggregation Framework的东西,它运行得很好。我想说几乎每个SQL聚合查询都可以使用这个框架来执行。 Here您有一些从SQL到聚合框架的“转换”示例。
无论如何,MongoDB是一个面向文档的数据库而不是像CouchDB这样的键值,所以我不知道它是否符合你的要求。