本發(fā)明涉及數(shù)據(jù)庫領(lǐng)域,尤其涉及一種適用SQL查詢方法的KV數(shù)據(jù)庫及其創(chuàng)建方法。
背景技術(shù):
::關(guān)系型數(shù)據(jù)庫是支持關(guān)系模型的數(shù)據(jù)庫,是目前使用最廣泛的數(shù)據(jù)庫系統(tǒng)。結(jié)構(gòu)化查詢語言(StructuredQueryLanguage)簡稱SQL,是最重要的關(guān)系數(shù)據(jù)庫操作語言,可以用它來查詢、更新、管理關(guān)系型數(shù)據(jù)庫。SQL語言簡潔、簡單好學(xué),擁有強大的表達(dá)能力,可以進行多方面的數(shù)據(jù)處理與分析,從而簡化系統(tǒng)的復(fù)雜度和開發(fā)部署難度,因此被廣泛接受使用。對于數(shù)據(jù)量不大的業(yè)務(wù)系統(tǒng),關(guān)系型數(shù)據(jù)庫是比較好的解決方案。但對于海量數(shù)據(jù),由于關(guān)系型數(shù)據(jù)庫水平擴展能力弱,單機的關(guān)系型數(shù)據(jù)庫容易成為整個系統(tǒng)的瓶頸。鍵/值存儲數(shù)據(jù)庫,簡稱KV存儲數(shù)據(jù)庫,是一種Nosql(非關(guān)系型數(shù)據(jù)庫)模型,其數(shù)據(jù)按照鍵值對的形式進行組織、索引和存儲,和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫相比,數(shù)據(jù)模型簡單,不支持復(fù)雜的表結(jié)構(gòu),不支持復(fù)雜查詢,具有易擴展、查詢速度快、支持大數(shù)據(jù)量的高速寫入查詢等特點。但是因其數(shù)據(jù)模型簡單,故應(yīng)用場景有限,對于復(fù)雜的業(yè)務(wù)場景,需要額外增加不少復(fù)雜的開發(fā)工作。公開號為CN105022791A的中國專利提出了一種新型的KV分布式數(shù)據(jù)存儲方法,包括如下步驟:S1分布化存儲,將每一行數(shù)據(jù)分為定性字段及定量字段,分別把定性字段構(gòu)成的表稱為鍵表,把定量字段構(gòu)成的表稱為值表,并在兩個表之間引入中間Key,S2對分布化存儲的數(shù)據(jù)進行查詢操作。該方案將關(guān)系型數(shù)據(jù)庫和KV型存儲綜合,使得數(shù)據(jù)查詢速度加快,但是該方案的存儲方式非常復(fù)雜。技術(shù)實現(xiàn)要素:本發(fā)明所要解決的技術(shù)問題是:提供一種適用SQL查詢方法的KV數(shù)據(jù)庫的創(chuàng)建方法及KV數(shù)據(jù)庫,能夠?qū)⒊跏糑V數(shù)據(jù)庫轉(zhuǎn)換為關(guān)系型數(shù)據(jù)庫而支持SQL查詢。為了解決上述技術(shù)問題,本發(fā)明采用的技術(shù)方案為:一種適用SQL查詢方法的KV數(shù)據(jù)庫的創(chuàng)建方法,包括:依據(jù)數(shù)據(jù)庫的名稱創(chuàng)建標(biāo)識,將所述數(shù)據(jù)庫的名稱和所述標(biāo)識作為第一key值,將所述數(shù)據(jù)庫的信息進行保存并作為第一value值,所述第一key值和第一value值構(gòu)成所述數(shù)據(jù)庫對應(yīng)的KV記錄;在所述數(shù)據(jù)庫中建立數(shù)據(jù)表;將所述數(shù)據(jù)庫的名稱和數(shù)據(jù)表的名稱作為第二key值,將所述數(shù)據(jù)表的信息進行保存并作為第二value值,所述第二key值和第二value值構(gòu)成所述數(shù)據(jù)表對應(yīng)的KV記錄;在所述數(shù)據(jù)表中插入數(shù)據(jù);將所述數(shù)據(jù)庫的名稱、數(shù)據(jù)表的名稱和數(shù)據(jù)的名稱作為第三key值,將所述數(shù)據(jù)的信息進行保存并作為第三value值,所述第三key值和第三value值構(gòu)成所述數(shù)據(jù)對應(yīng)的KV記錄;獲得所述適用SQL查詢方法的KV數(shù)據(jù)庫。本發(fā)明提供的另一個技術(shù)方案為:一種適用SQL查詢方法的KV數(shù)據(jù)庫,包括:第一KV記錄,用于與數(shù)據(jù)庫對應(yīng);所述第一KV記錄的key值由所述數(shù)據(jù)庫的名稱和依據(jù)所述名稱創(chuàng)建的標(biāo)識構(gòu)成,所述第一KV記錄的value值中保存所述數(shù)據(jù)庫的信息;第二KV記錄,用于與所述數(shù)據(jù)庫中的數(shù)據(jù)表對應(yīng);所述第二KV記錄的key值由所述數(shù)據(jù)庫的名稱和數(shù)據(jù)表的名稱構(gòu)成,所述第二KV記錄的value值中保存所述數(shù)據(jù)表的信息;第三KV記錄,用于與所述數(shù)據(jù)表中的數(shù)據(jù)對應(yīng);所述第三KV記錄的key值由所述KV數(shù)據(jù)庫的名稱、數(shù)據(jù)表的名稱和數(shù)據(jù)的名稱構(gòu)成,所述第三KV記錄的value值中保存所述數(shù)據(jù)的信息。本發(fā)明的有益效果在于:(1)上述適用SQL查詢方法的KV數(shù)據(jù)庫的創(chuàng)建方法,數(shù)據(jù)庫對應(yīng)的第一key值由數(shù)據(jù)庫的名稱和標(biāo)識組成,數(shù)據(jù)表對應(yīng)的第二key值由數(shù)據(jù)庫的名稱、和數(shù)據(jù)表的名稱組成,數(shù)據(jù)對應(yīng)的第三key值由數(shù)據(jù)庫的名稱、數(shù)據(jù)表的名稱和數(shù)據(jù)的名稱組成,最終得到的KV數(shù)據(jù)庫呈關(guān)系型布局,從而查詢時可以遍歷所有包含該標(biāo)識的第一key值,得到所有的數(shù)據(jù)庫實例,再在查詢到的數(shù)據(jù)庫中遍歷包含數(shù)據(jù)庫名第二key值,從而得到該數(shù)據(jù)下所有的表及表信息,再依據(jù)與數(shù)據(jù)對應(yīng)的KV記錄即可快速獲取到數(shù)據(jù)。(2)上述KV數(shù)據(jù)庫,通過設(shè)置第一KV記錄、第二KV記錄和第三KV記錄,使得KV數(shù)據(jù)庫的布局呈關(guān)系型,從而能夠?qū)V數(shù)據(jù)庫進行SQL查詢,增強了KV系統(tǒng)的使用便利性。附圖說明圖1為本發(fā)明實施例一的適用SQL查詢方法的KV數(shù)據(jù)庫的創(chuàng)建方法的流程圖。具體實施方式為詳細(xì)說明本發(fā)明的技術(shù)內(nèi)容、所實現(xiàn)目的及效果,以下結(jié)合實施方式并配合附圖予以說明。本發(fā)明最關(guān)鍵的構(gòu)思在于:分別創(chuàng)建與數(shù)據(jù)庫、數(shù)據(jù)表和數(shù)據(jù)對應(yīng)的KV記錄,數(shù)據(jù)庫對應(yīng)的key值由數(shù)據(jù)庫的名稱和標(biāo)識組成,數(shù)據(jù)表對應(yīng)的key值由數(shù)據(jù)庫的名稱、和數(shù)據(jù)表的名稱組成,數(shù)據(jù)對應(yīng)的key值由數(shù)據(jù)庫的名稱、數(shù)據(jù)表的名稱和數(shù)據(jù)的名稱組成。請參照圖1,本發(fā)明提供:一種適用SQL查詢方法的KV數(shù)據(jù)庫的創(chuàng)建方法,包括:依據(jù)數(shù)據(jù)庫的名稱創(chuàng)建標(biāo)識,將所述數(shù)據(jù)庫的名稱和所述標(biāo)識作為第一key值,將所述數(shù)據(jù)庫的信息進行保存并作為第一value值,所述第一key值和第一value值構(gòu)成所述數(shù)據(jù)庫對應(yīng)的KV記錄;在所述數(shù)據(jù)庫中建立數(shù)據(jù)表;將所述數(shù)據(jù)庫的名稱和數(shù)據(jù)表的名稱作為第二key值,將所述數(shù)據(jù)表的信息進行保存并作為第二value值,所述第二key值和第二value值構(gòu)成所述數(shù)據(jù)表對應(yīng)的KV記錄;在所述數(shù)據(jù)表中插入數(shù)據(jù);將所述數(shù)據(jù)庫的名稱、數(shù)據(jù)表的名稱和數(shù)據(jù)的名稱作為第三key值,將所述數(shù)據(jù)的信息進行保存并作為第三value值,所述第三key值和第三value值構(gòu)成所述數(shù)據(jù)對應(yīng)的KV記錄;獲得所述適用SQL查詢方法的KV數(shù)據(jù)庫。進一步的,依據(jù)所述數(shù)據(jù)對應(yīng)的KV記錄為所述數(shù)據(jù)建立索引。進一步的,依據(jù)所述索引查詢所述數(shù)據(jù)。從上述描述可知,通過建立索引,則查詢數(shù)據(jù)時,不需要遍歷所有的記錄,而是依據(jù)索引查詢,大大減少了查詢時間。進一步的,所述數(shù)據(jù)的信息包含行id或列id。進一步的,依據(jù)所述行id或列id建立索引。從上述描述可知,依據(jù)行id或列id建立索引是最常見的方法之一,也可以采用任何現(xiàn)有技術(shù)中能夠?qū)崿F(xiàn)建立索引的方法。本發(fā)明的另一個技術(shù)方案為:一種適用SQL查詢方法的KV數(shù)據(jù)庫,包括:第一KV記錄,用于與數(shù)據(jù)庫對應(yīng);所述第一KV記錄的key值由所述數(shù)據(jù)庫的名稱和依據(jù)所述名稱創(chuàng)建的標(biāo)識構(gòu)成,所述第一KV記錄的value值中保存所述數(shù)據(jù)庫的信息;第二KV記錄,用于與所述數(shù)據(jù)庫中的數(shù)據(jù)表對應(yīng);所述第二KV記錄的key值由所述數(shù)據(jù)庫的名稱和數(shù)據(jù)表的名稱構(gòu)成,所述第二KV記錄的value值中保存所述數(shù)據(jù)表的信息;第三KV記錄,用于與所述數(shù)據(jù)表中的數(shù)據(jù)對應(yīng);所述第三KV記錄的key值由所述KV數(shù)據(jù)庫的名稱、數(shù)據(jù)表的名稱和數(shù)據(jù)的名稱構(gòu)成,所述第三KV記錄的value值中保存所述數(shù)據(jù)的信息。進一步的,還包括依據(jù)所述數(shù)據(jù)對應(yīng)的KV記錄為所述數(shù)據(jù)建立的索引。進一步的,所述數(shù)據(jù)的信息包含行id或列id,所述KV數(shù)據(jù)庫還包括依據(jù)所述行id或列id建立的索引。請參照圖1,本發(fā)明的實施例一為:一種適用SQL查詢方法的KV數(shù)據(jù)庫的創(chuàng)建方法,包括:依據(jù)數(shù)據(jù)庫的名稱創(chuàng)建標(biāo)識,將所述數(shù)據(jù)庫的名稱和所述標(biāo)識作為第一key值,將所述數(shù)據(jù)庫的信息進行保存并作為第一value值,所述第一key值和第一value值構(gòu)成所述數(shù)據(jù)庫對應(yīng)的KV記錄;該數(shù)據(jù)庫為使用現(xiàn)有技術(shù)創(chuàng)建的數(shù)據(jù)庫;在所述數(shù)據(jù)庫中建立數(shù)據(jù)表;將所述數(shù)據(jù)庫的名稱和數(shù)據(jù)表的名稱作為第二key值,將所述數(shù)據(jù)表的信息進行保存并作為第二value值,所述第二key值和第二value值構(gòu)成所述數(shù)據(jù)表對應(yīng)的KV記錄;在所述數(shù)據(jù)表中插入數(shù)據(jù);將所述數(shù)據(jù)庫的名稱、數(shù)據(jù)表的名稱和數(shù)據(jù)的名稱作為第三key值,將所述數(shù)據(jù)的信息進行保存并作為第三value值,所述第三key值和第三value值構(gòu)成所述數(shù)據(jù)對應(yīng)的KV記錄;所述數(shù)據(jù)的信息包含行id或列id,依據(jù)所述行id或列id建立索引。獲得所述適用SQL查詢方法的KV數(shù)據(jù)庫。下面采用一個具體的例子來說明DDL和DML在這種數(shù)據(jù)組織方式下上述創(chuàng)建方法的工作流程。假設(shè)在現(xiàn)有的數(shù)據(jù)庫中有school數(shù)據(jù)庫,school數(shù)據(jù)庫下有student表,student表的結(jié)構(gòu)和數(shù)據(jù)如表1所示:表1idnamebirthdaygender20160401Tom1995/3/6120160402Jerry1995/11/2120160403Lily1995/8/250首先進行建庫的DDL操作,創(chuàng)建school數(shù)據(jù)庫。對應(yīng)的SQL語句為“CREATEDATABASEschool”。系統(tǒng)接收到這條SQL后,先從“元數(shù)據(jù)cache”中判斷是否存在school庫,若存在則返回失敗,不允許重復(fù)創(chuàng)建相同名字的數(shù)據(jù)庫;若不存在,則會插入一條KV記錄,其中key為dbs_school,value則記錄這一些相關(guān)信息。創(chuàng)建數(shù)據(jù)庫后,那么kv系統(tǒng)中的布局如表2所示:表2然后需要創(chuàng)建student表,對應(yīng)的SQL語句為“CREATETABLEstudent(idint,namevarchar(64),birthdaydate,genderint)”。系統(tǒng)接收到這條SQL后,先從“元數(shù)據(jù)cache”中判斷school下是否已經(jīng)存在student表,若存在,則返回失?。蝗舨淮嬖?,則會插入如表3所示的KV記錄。表3接下來,說明插入數(shù)據(jù)的過程,這里僅以類行式存儲為例。先插入表1例子中的第一條記錄,對應(yīng)的SQL語句為“INSERTINTOstudent(id,name,birthday,gender)values(20160401,“Tom”,“1995/3/6”,1)”。系統(tǒng)接收到這條SQL后,先從“元數(shù)據(jù)cache”中判斷表結(jié)構(gòu)是否跟插入語句匹配,若不匹配則返回失??;若正常匹配,則需要插入4條KV記錄。加上表1例子中的其余兩條記錄,最終KV系統(tǒng)的數(shù)據(jù)布局如表4。表4keyvalueschool_student_r0_id20160401school_student_r0_nameTomschool_student_r0_birthday1995/3/6school_student_r0_gender1school_student_r1_id20160402school_student_r1_nameJerryschool_student_r1_birthday1995/11/2school_student_r1_gender1school_student_r2_id20160403school_student_r2_nameLilyschool_student_r2_birthday1995/8/25school_student_r2_gender0無索引的數(shù)據(jù)檢索假設(shè)現(xiàn)在需要查詢?nèi)縢ender為1的id,而當(dāng)前gender列上并無索引,對應(yīng)的SQL語句為“SELECTidFROMstudentWHEREgender=1”。系統(tǒng)接收到這條SQL語句后,先從“元數(shù)據(jù)cache”中判斷是否存在student表,以及表中是否存在id、gender列,若判斷sql語句正常,則開始進行數(shù)據(jù)檢索。接著需要遍歷student表中所有的gender記錄,行id先從r0開始。先獲取school_student_r0_gender,發(fā)現(xiàn)值為1,則再獲取school_student_r0_id的值,接著往下遍歷r1、r2的gender,操作類似。最終返回的id包括20160401、20160402。建立索引假設(shè)需要經(jīng)常根據(jù)id查找某個學(xué)生,那么就有必要在id列上創(chuàng)建索引。對應(yīng)的SQL語句為“CREATEINDEXi0ONstudent(id)”。系統(tǒng)接收到這條SQL語句后,先從“元數(shù)據(jù)cache”中判斷是否存在student表以及id列,還有索引i0是否未被創(chuàng)建。判斷合法后,首先為已存在的記錄添加索引記錄,那么需要增加如表5所示的KV記錄:表5keyvalueschool_student_i0_20160401r0school_student_i0_20160402r1school_student_i0_20160403r2接著修改student表信息,加入索引信息,對應(yīng)KV記錄變成如表6所示:表6帶索引的數(shù)據(jù)檢索假設(shè)現(xiàn)在需要查找id為20160402的學(xué)生的姓名,對應(yīng)的SQL語句為“SELECTnameFROMstudentWHEREid=20160402”。系統(tǒng)接收到這條SQL語句后,判斷完合法性之后,發(fā)現(xiàn)在id列上存在索引i0,那么就不需要遍歷所有的記錄來查找。先根據(jù)索引school_student_i0_20160402找到對應(yīng)的行id為r1,之后就可以快速組合出school_student_r1_name這個key,然后根據(jù)這個key快速找到對應(yīng)的name為Jerry。本發(fā)明的實施例二為:一種上述實施例一的適用SQL查詢方法的KV數(shù)據(jù)庫的創(chuàng)建方法創(chuàng)建的KV數(shù)據(jù)庫,包括:一種適用SQL查詢方法的KV數(shù)據(jù)庫,包括:第一KV記錄,用于與數(shù)據(jù)庫對應(yīng);所述第一KV記錄的key值由所述數(shù)據(jù)庫的名稱和依據(jù)所述名稱創(chuàng)建的標(biāo)識構(gòu)成,所述第一KV記錄的value值中保存所述數(shù)據(jù)庫的信息;第二KV記錄,用于與所述數(shù)據(jù)庫中的數(shù)據(jù)表對應(yīng);所述第二KV記錄的key值由所述數(shù)據(jù)庫的名稱和數(shù)據(jù)表的名稱構(gòu)成,所述第二KV記錄的value值中保存所述數(shù)據(jù)表的信息;第三KV記錄,用于與所述數(shù)據(jù)表中的數(shù)據(jù)對應(yīng);所述第三KV記錄的key值由所述KV數(shù)據(jù)庫的名稱、數(shù)據(jù)表的名稱和數(shù)據(jù)的名稱構(gòu)成,所述第三KV記錄的value值中保存所述數(shù)據(jù)的信息;所述數(shù)據(jù)的信息包含行id或列id,所述KV數(shù)據(jù)庫還包括依據(jù)所述行id或列id建立的索引。例如,對于數(shù)據(jù)庫db1和數(shù)據(jù)庫db2,利用一個特定的前綴標(biāo)識加上數(shù)據(jù)庫名作為key,value中保存著數(shù)據(jù)庫的基本信息,如創(chuàng)建時間等。那么系統(tǒng)啟動時可以遍歷所有以此標(biāo)識為前綴的所有key,從而得到所有的數(shù)據(jù)庫實例,緩存到元數(shù)據(jù)cache中。如表7中示例所示,特定的前綴為“dbs_”,共有兩個數(shù)據(jù)庫實例,分別是db1和db2,那么KV存儲系統(tǒng)中就有兩條記錄dbs_db1和dbs_db2。表7keyvaluedbs_db1dbInfo1dbs_db2dbInfo2…………db1|table1db1tableinfo1db1|table2db1tableinfo2db2|table1db2tableinfo1…………將數(shù)據(jù)庫名稱作為前綴標(biāo)識,加上個特殊字符和表名作為key,value中保存著表的基本信息,如創(chuàng)建時間、列等。那么在拿到數(shù)據(jù)庫名稱之后,可以遍歷以數(shù)據(jù)庫名為前綴的記錄,從而得到此數(shù)據(jù)庫下所有的表,及表信息。如表7所示,db1數(shù)據(jù)庫下有table1和table2兩張表,db2下有table1一張表。將所有的列,以及列的類型等信息,若還有索引,則都作為表信息的一部分進行存儲。如表7所示,db1下table1的所有列以及索引信息,會保存在db1tableinfo1中。普通數(shù)據(jù)的組織可以分為類行式存儲和類列式存儲兩種。類行式存儲,即同一行記錄都緊挨一起,那么key可以如此組織:數(shù)據(jù)庫名_表名_行id_列id。而value則為對應(yīng)的值。如表9所示,表示數(shù)據(jù)庫db1下的表table1的第一行記錄中第一列的值為v1.1。表8類列式存儲,即同一列記錄都緊挨一起,那么key可以如此組織:數(shù)據(jù)庫名_表名_列id_行id。而value則為對應(yīng)的值。如表9所示,表示數(shù)據(jù)庫db1下的表table1的第一列記錄中第一行的值為v1.1。表9keyvaluedb1_table1_c1_r1v1.1db1_table1_c1_r2v1.2…………db1_table1_c2_r1v2.1db1_table1_c2_r2v2.2…………而索引的作用主要是為了加速查找,那么索引數(shù)據(jù)的key可以如此組織:數(shù)據(jù)庫名_表名_索引id_字段value。而此key對應(yīng)的value則為對應(yīng)記錄的行id。如表10所示,db1中的table1有個為列c1建立名為i1的索引。若已經(jīng)知道c1的值為v1.1,那么就可以立刻根據(jù)這個值找到對應(yīng)的行id為r1,獲取r1之后就可以快速的獲取到其他列的值。表10keyvaluedb1_table1_i1_v1.1r1db1_table1_i1_v2.1r2…………綜上所述,本發(fā)明提供的適用SQL查詢方法的KV數(shù)據(jù)庫及其創(chuàng)建方法,能夠在KV系統(tǒng)之上構(gòu)建SQL查詢,增強KV系統(tǒng)使用的便利性,以及擴展應(yīng)用場景,減少業(yè)務(wù)上的開發(fā)工作。以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等同變換,或直接或間接運用在相關(guān)的
技術(shù)領(lǐng)域:
:,均同理包括在本發(fā)明的專利保護范圍內(nèi)。當(dāng)前第1頁1 2 3 當(dāng)前第1頁1 2 3