2013-12-09 47 views
0

儘管我們認爲NoSQL數據庫已經填補了RDBMS方面存在的一些缺陷,但隨着時間的推移,我在NoSQL DB中遇到了一些挑戰在他們的查詢生態系統領域。

Couchbase例如,像它的母親CouchDB在使用視圖,列表,密鑰查找,映射縮減,e.t.c來讀取數據方面已經有了重大改進。對於他們巨大的2.X版本,Couchbase甚至有moved to createSQL-like query engine。 MongoDB也做出了嚴重的改進,並且可能會有複雜的查詢以及許多其他的NoSQL DB開發。

大多數NoSQL DBs can perform Complex queries基於LOGICAL and COMPARISON OPERATORS例如, AND,OR, == e.t.c然而,對數據進行aggergation和執行復雜的關係是我的一個問題。例如,在CouchDB和/或Couchbase中,視圖只能跨越單個數據庫。編寫一個視圖可以彙總來自兩個或更多數據庫的數據,這是不可能的。

讓我現在來解決這個問題。函數(無論聚合與否):AVGSUMROUNDTRUNCMAXMIN,e.t.c缺乏數據類型使得它不可能有效地與日期和時間,因此缺乏日期和時間函數例如工作TO_DATESYSDATE(用於系統日期/時間),ADD_MONTHSs,DATE BETWEEN,DATE/TIME format Conversione.t.c.確實,很多人會說,他們缺乏模式,類型和東西,但是,我發現自己並沒有逃避對那裏列出的至少任何一項功能的需求。例如,因爲NoSQL的數據塊沒有日期/時間數據類型,這是很難執行基於這些查詢,因爲你可能要分析基於時間的趨勢。此外,其他人也試圖使用UNIX/EPOC時間戳和東西來解決這個問題,但它並不是一個解決方案。

Map Reduce可以用來達到某個(小)程度的聚合,但開銷已經被認爲是很棒的。然而,GROUP BY功能的缺乏使得它成爲一個緊張的解決方案來篩選你想要的東西。請看下面的查詢:
NoSQL數據庫查詢問題中的聚合函數,缺少類型和熵

​​

這是不是很容易實現對CouchDB的或Couchbase。我不確定它是否可能在MongoDB上。我希望可以開箱即用。這使得它很難使用的NoSQL作爲數據倉庫或OLTP/OLAP溶液。我發現,每一個複雜的分析需要時間來進行,需要通過不同的數據集進行分頁做的中間件。現在,最有經驗的專家(例如CLOUDANT)已經調整了LUCENE進行復雜的查詢,但因爲它最初是用於索引和全文檢索,它並沒有解決大部分的NoSQL DB的缺乏FUNCTIONSDATA AGGREGATION

由於缺少FUNCTIONS,大多數NoSQL DB具有NULL數據類型,但缺少將對象轉換爲其他內容的選項,如在某些RDBMS中。例如在Oracle中,我可以:爲了包括所有行同時執行說上一個給定列的AVG計算NVL(COLUMN,0)(因爲比如說,通過默認空列將不會被計算/包括在查詢處理)。

爲了完全理解問題,例如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) 
} 
滿足過濾器的文檔已通過並進入下一個階段或進入reduce函數。想象一下,一個文檔結構像下面這樣:

 
{ 
    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數據庫解決方案已經取得了很大的進展,上面詳細討論了查詢能力?什麼樣的關鍵特徵使其脫穎而出?

Qn 2:缺少一個Schema,或者是 Key-Value缺少 FUNCTIONS查詢這些數據庫的原因嗎?在大多數NoSQL數據庫中缺乏聚合功能的原因是什麼?

Qn 3:如果上面的查詢能力在任何NoSQL DB中都是可能的,那麼使用現有的NoSQL基礎結構可以獲得上述最後兩個(2)查詢問題(考慮您選擇的任何NoSQL技術)

+0

你用SQL術語描述了所有的東西,SQL不給你什麼讓你想要考慮noSQL?看來你正在將RDBMS範例強制納入nosql。 – scalabilitysolved

+0

您是否建議在使用NoSQL時不應該有可能遇到需要進行聚合的問題?您是否曾經需要在NoSQL中獲得某些數據的'MIN'或'MAX'或'AVG'?我相信這樣的計算默認與RDBMS無關。它們是由數據處理,報告,分析e.t.c產生的需求。這就是我認爲 –

+0

就我個人而言,我使用couchbase,開箱即用,它爲map reduce作業提供count,sum,stats,但該系統不是分析系統,對於即席查詢也不是很好,但SQL是。通過你想要做的查詢,我會100%使用RDBMS。 – scalabilitysolved

回答

1

MongoDB有一個叫Aggregation Framework的東西,它工作得很好。我會說幾乎所有的SQL Aggregation查詢都可以在這個框架中執行。 Here你有一些從SQL到聚合框架的「轉換」的例子。

不管怎樣,MongoDB是一個面向文檔的數據庫,而不是像CouchDB那樣的鍵值,所以我不知道它是否符合您的要求。

+0

+1哇!實際上,MongoDB已經走了很長一段路。感謝你的回答。但是,CouchDB,Couchbase和Cloudant仍然缺少這些功能。 –

+1

@MuzaayaJoshua在未來,請查看N1QL for couchbase,仍在開發中,但更符合您的需求。 http://www.couchbase.com/communities/n1ql – scalabilitysolved