一種多結構數(shù)據(jù)庫集成查詢方法
【技術領域】
[0001]本發(fā)明涉及一種多結構數(shù)據(jù)庫集成查詢方法。
【背景技術】
[0002]傳統(tǒng)關系型數(shù)據(jù)庫的讀寫性能以及水平擴展性在大數(shù)據(jù)背景下面臨嚴峻的考驗,而NoSQL數(shù)據(jù)庫以靈活的數(shù)據(jù)模型和良好的水平擴展性彌補了關系型數(shù)據(jù)庫無法滿足的特性。如今,SQL與NoSQL集成存儲成為數(shù)據(jù)庫架構新的研宄方向。那么,上層應用如何透明地訪問異構數(shù)據(jù)源也成為了亟待解決的問題。
[0003]目前,大部分現(xiàn)有技術只能針對特定的NoSQL數(shù)據(jù)庫進行訪問,如Hbase的各類API只能使應用程序訪問Hbase數(shù)據(jù)庫,并沒有考慮到SQL與NoSQL集成存儲時,異構數(shù)據(jù)源透明訪問的問題。而某些文獻或論文中提及一些集成訪問的方案,或者沒有具體實現(xiàn),或者較為基本,沒有充分利用SQL查詢語言以及關系型數(shù)據(jù)庫的成熟技術。
[0004]基于復合查詢語言的SQL與NoSQL數(shù)據(jù)庫的統(tǒng)一查詢模型提供了基本的SQL與NoSQL集成查詢的模型,包含NoSQL數(shù)據(jù)轉(zhuǎn)化、查詢模式轉(zhuǎn)化、查詢執(zhí)行與結果輸出三大模塊。該模型的架構如圖1所示,具體查詢步驟如下:
[0005](I)NoSQL數(shù)據(jù)轉(zhuǎn)化模塊:基于RDF思想,將NoSQL數(shù)據(jù)庫中的所有數(shù)據(jù)轉(zhuǎn)化為(id, key, value)形式的三元組,并將轉(zhuǎn)化后得到的三元組數(shù)據(jù)注入SQL數(shù)據(jù)庫。
[0006](2)查詢模式轉(zhuǎn)化模塊:開發(fā)者編寫特定格式的復合查詢語言,由查詢模式轉(zhuǎn)化模塊對其進行解析,分離出SQL查詢部分和NoSQL查詢部分。將NoSQL查詢部分轉(zhuǎn)化為對注入至SQL數(shù)據(jù)庫中的三元組數(shù)據(jù)的SQL查詢形式,再與分離出來的SQL查詢部分合并,成為最終的SQL查詢形式。
[0007](3)查詢執(zhí)行與結果輸出模塊:執(zhí)行最終的SQL查詢形式,處理查詢結果并返回給用戶。
[0008]上述基于復合查詢語言的SQL與NoSQL數(shù)據(jù)庫的統(tǒng)一查詢模型存在如下缺陷:
[0009](I) NoSQL數(shù)據(jù)轉(zhuǎn)化模塊將NoSQL數(shù)據(jù)庫中的所有數(shù)據(jù)進行轉(zhuǎn)化并注入到SQL數(shù)據(jù)庫中,供查詢執(zhí)行模塊進行訪問;這個過程轉(zhuǎn)化了很多并不符合查詢條件的數(shù)據(jù),造成SQL數(shù)據(jù)庫存儲空間的浪費,而過多的多余記錄數(shù)據(jù)則會影響查詢執(zhí)行模塊的查詢效率。
[0010](2)查詢模式轉(zhuǎn)化模塊支持特定格式的復合查詢語言的轉(zhuǎn)化,而這種復合查詢語言并不具有通用性,為開發(fā)者的使用帶來一定的難度和學習成本。
[0011](3)查詢模式轉(zhuǎn)化模塊中對NoSQL查詢部分的轉(zhuǎn)化是對所有的三元組數(shù)據(jù)進心先交叉連接后數(shù)據(jù)集篩選的算法,如果存在N張記錄數(shù)為M的三元組數(shù)據(jù)表,那么需要(N-1)次交叉連接操作,產(chǎn)生MN條記錄,再對其進行條件篩選,查詢效率較低。
[0012]縮略語和關鍵術語定義
[0013]SQL Structured Query Language結構化查詢語言,現(xiàn)泛指關系型數(shù)據(jù)庫
[0014]NoSQL Not Only SQL泛指非關系型數(shù)據(jù)庫
[0015]RDF Resource Descript1n Framework 資源描述框架
[0016]API Applicat1n Programming Interface 應用程序編程接口
【發(fā)明內(nèi)容】
[0017]發(fā)明目的:為了克服現(xiàn)有技術中存在的不足,本發(fā)明提供一種基于標準結構化查詢語言預分析的關系型數(shù)據(jù)庫與非關系型數(shù)據(jù)庫集成查詢的方法,該方法充分利用SQL查詢語言以及關系型數(shù)據(jù)庫的成熟技術,對查詢算法進行優(yōu)化,以降低查詢時間、提高查詢效率,該方法能夠使開發(fā)者直接使用標準化的SQL語句進行數(shù)據(jù)訪問,不用關心底層數(shù)據(jù)源的類型。
[0018]技術方案:為實現(xiàn)上述目的,本發(fā)明采用的技術方案為:
[0019]針對NoSQL數(shù)據(jù)庫的查詢,為了克服現(xiàn)有架構方案中NoSQL數(shù)據(jù)轉(zhuǎn)化冗余以及查詢模式轉(zhuǎn)化算法效率低造成的SQL存儲空間浪費和查詢效率不高的問題,本發(fā)明提供一種多結構數(shù)據(jù)庫集成查詢方法,本發(fā)明采用查詢語言預分析方案以及查詢模式轉(zhuǎn)化采用先預篩選后內(nèi)連接的算法,減少NoSQL轉(zhuǎn)化返回的數(shù)據(jù)量和表連接操作的次數(shù),提高算法執(zhí)行效率,從而降低SQL存儲空間的使用率和提高查詢效率。該方法包括如下步驟:
[0020](I)系統(tǒng)對用戶查詢進行預分析,預分析內(nèi)容包括:①根據(jù)數(shù)據(jù)表字典,識別出該查詢屬于SQL類型還是NoSQL類型,分類型處理;②從用戶查詢的查詢語句中提取出NoSQL數(shù)據(jù)的預查詢條件,即NoSQL數(shù)據(jù)的等值查詢條件;③從用戶查詢的查詢語句中提取出NoSQL數(shù)據(jù)的二次查詢條件集從用戶查詢的查詢語句中提取出該查詢包含的最大字段集;
[0021](2) NoSQL數(shù)據(jù)預查詢及轉(zhuǎn)化:根據(jù)預查詢條件,對NoSQL數(shù)據(jù)進行一次預查詢,僅將符合預查詢條件的NoSQL數(shù)據(jù)轉(zhuǎn)化為三元組數(shù)據(jù),以降低NoSQL數(shù)據(jù)轉(zhuǎn)化冗余和注入SQL數(shù)據(jù)庫中的三元組數(shù)據(jù),從而降低SQL數(shù)據(jù)庫的存儲空間的占用;
[0022](3)查詢模式轉(zhuǎn)化:根據(jù)二次查詢條件集和最大字段集,采用預篩選內(nèi)連接的算法,將三元組數(shù)據(jù)由NoSQL查詢模式轉(zhuǎn)化為SQL查詢模式,形成最終的SQL查詢語句;
[0023](4)查詢執(zhí)行與結果輸出:執(zhí)行SQL查詢語句,處理查詢結果并返回給用戶。
[0024]上述方法具體包括如下步驟:
[0025](101)根據(jù)用戶查詢,從開發(fā)者構建的標準SQL查詢語句中獲取查詢目標的表名,執(zhí)行步驟(102);
[0026](102)連接數(shù)據(jù)表字典,查詢表名對應的記錄,執(zhí)行步驟(103);
[0027](103)從記錄中獲取表信息,執(zhí)行步驟(104);
[0028](104)根據(jù)表信息識別出用戶查詢的類型:對于SQL類型查詢,執(zhí)行步驟(120);對于NoSQL類型查詢,執(zhí)行步驟(105);
[0029](105)從用戶查詢的查詢語句中提取NoSQL數(shù)據(jù)的預查詢條件,并調(diào)用NoSQL數(shù)據(jù)轉(zhuǎn)化模塊,具體包括:
[0030](051)提取預查詢條件,執(zhí)行步驟(052);
[0031](052)根據(jù)預查詢條件,對NoSQL數(shù)據(jù)進行一次預查詢,執(zhí)行步驟(053);
[0032](053)將查詢結果轉(zhuǎn)化為(id, key, value)形式的三元組數(shù)據(jù),執(zhí)行步驟(054);
[0033](054)連接SQL數(shù)據(jù)庫,執(zhí)行步驟(055);
[0034](055)向SQL數(shù)據(jù)庫中注入三元組數(shù)據(jù),返回步驟(105),并執(zhí)行步驟(106);
[0035](106)從用戶查詢的查詢語句中提取NoSQL數(shù)據(jù)的二次查詢條件集,執(zhí)行步驟
(107);
[0036](107)從用戶查詢的查詢語句中提取用戶查詢包含的最大字段集,執(zhí)行步驟
(108);
[0037](108)初始化循環(huán)參數(shù)i = 0,執(zhí)行步驟(109);
[0038](109)判斷i是否小于二次查詢條件集的長度:若小于,則執(zhí)行步驟(110);否則,執(zhí)行步驟(112);
[0039](110)在最大字段集中對應字段后添加當前查詢條件,執(zhí)行步驟(111);當前查詢條件為二次查詢條件集中的第i個查詢條件,最大字段集中對應字段為與當前查詢條件相同的字段;
[0040](111) i++,返回步驟(109);
[0041](112)初始化循環(huán)參數(shù)j = 0,執(zhí)行步驟(113);
[0042](113)判斷j是否小于最大字段集的長度:若小于,則執(zhí)行步驟(114);否則,執(zhí)行步驟(119);
[0043](114)判斷最大字段集中第j個字段后是否存在查詢條件:若存在,則執(zhí)行步驟(115);否則,執(zhí)行步驟(117);
[0044](115)將最大字段集中第j個字段對應的三元組數(shù)據(jù)按照查詢條件進行預篩選,獲得預篩選結果,執(zhí)行步驟(116);
[0045](116)對預篩選結果進行id等值內(nèi)連接,產(chǎn)生對應的查詢語句,執(zhí)行步驟(118);
[0046](117)對最大字段集中第j個字段對應的三元組數(shù)據(jù)進行id等值內(nèi)連接,產(chǎn)生對應的查詢語句,執(zhí)行步驟(118);
[0047](118) j++,返回步驟(113);
[0048](119) id等值內(nèi)連接產(chǎn)生對應的查詢語句,使用該查詢語句替換相應的NoSQL變量,形成最終的SQL查詢語句,執(zhí)行步驟(120);
[0049](120)連接SQL數(shù)據(jù)庫,執(zhí)行步驟(121);
[0050](121)執(zhí)行查詢;
[0051](122)返回最終的查詢結果。
[0052]有益效果:本發(fā)明提供的多結構數(shù)據(jù)庫集成查詢方法,與現(xiàn)有的基于復合查詢語句的SQL與NoSQL數(shù)據(jù)庫的統(tǒng)一查詢模型相比,能夠降低SQL存儲空間的占用量以及降低整個查詢的執(zhí)行時間,提高了數(shù)據(jù)查詢的效率;同時,開發(fā)者只需構建標準的SQL查詢語言,即可實現(xiàn)對關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫的無差別查詢,無需學習新的查詢語言,降低開發(fā)成本。
【附圖說明】
[0053]圖1為基于混合查詢模式的SQL與NoSQL數(shù)據(jù)庫的統(tǒng)一查詢模型的架構圖;
[0054]圖2為本發(fā)明的多結構數(shù)據(jù)庫集成查詢方法的架構圖;
[0055]圖3為多結構數(shù)據(jù)庫集成查詢方法實施流程圖。
【具體實施方式】
[0056]下面結合附圖對本發(fā)明作更進一步的說明。
[0057]針對NoSQL查詢模式的轉(zhuǎn)化,基于復合查詢語言的SQL與NoSQL數(shù)據(jù)庫的統(tǒng)一查詢模型采用了先交叉連接后篩選數(shù)據(jù)集的算法,對所有的三元組數(shù)據(jù)表進行交叉連接操作;該算法會返回大量的冗余記錄,而大量數(shù)據(jù)表之間的連接操作會導致整個查詢效率的降低。為提高查詢轉(zhuǎn)化算法效率,本發(fā)明提出一種預篩選內(nèi)連接的NoSQL查詢模式轉(zhuǎn)化方法。預篩選包含:①根據(jù)數(shù)據(jù)表字典,識別出該查詢屬于SQL類型還是NoSQL類型,分類型處理;②從用戶查詢的查詢語句中提取出NoSQL數(shù)據(jù)的預查詢條件,即NoSQL數(shù)據(jù)的等值查詢條件;③從用戶查詢的查詢語句中提取出NoSQL數(shù)據(jù)的二次查詢條件集;④從用戶查詢的查詢語句中提取出該查詢包含的最大字段集。
[0058]首先根據(jù)SQL預分析,獲得查詢的最大字段集,當并不是每一次查詢都涉及所有字段,查詢字段的減少則意味著表連接操作次數(shù)的降低,這提高了整體查詢