專利名稱:環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法
技術(shù)領(lǐng)域:
本發(fā)明屬于分布式數(shù)據(jù)存儲(chǔ)領(lǐng)域,主要涉及一種環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法。
背景技術(shù):
類似于MongoDB這類的面向文檔的Key-Value數(shù)據(jù)庫(kù),由于其存儲(chǔ)的都是類似于XML、JSON這類有結(jié)構(gòu)和語(yǔ)義信息的文檔,所以以消耗更多的內(nèi)存和磁盤空間為代價(jià), 在值上建立了索引,通過對(duì)索引的檢索,能夠較好的支持對(duì)單表的條件查詢,即便如此,像 MongoDB這樣的面向文檔數(shù)據(jù)庫(kù)也并不支持復(fù)雜的多表連接查詢。對(duì)于另一款常見的Key-Value數(shù)據(jù)庫(kù)=Hbase,其數(shù)據(jù)是存儲(chǔ)在分布式文件系統(tǒng) Hadoop上的,而它的SQL查詢功能實(shí)際上是借助基于Hadoop的Hive來(lái)實(shí)現(xiàn)的,Hive是建立在Hadoop上的一款可以對(duì)數(shù)據(jù)進(jìn)行提取轉(zhuǎn)化加載的工具,其大部分的查詢功能是 MapReduce完成的,這樣就導(dǎo)致了如下兩個(gè)缺點(diǎn)首先因?yàn)镠ive本身是針對(duì)讀多寫少的數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用設(shè)計(jì)的,因此Hive中并不支持對(duì)數(shù)據(jù)的改寫和添加,如果數(shù)據(jù)庫(kù)中存儲(chǔ)的是頻繁更新的數(shù)據(jù),Hbase是沒辦法支持的;另外由于MapReduce本身具有較高的延遲,所以導(dǎo)致了 Hbase的SQL查詢延遲較高。目前流行的環(huán)形架構(gòu)Key-Value數(shù)據(jù)庫(kù)fassandra,通過對(duì)指定列建立列值索弓丨,可以支持對(duì)單表的條件查詢,但目前也不支持多表連接查詢。
發(fā)明內(nèi)容
針對(duì)現(xiàn)有方法存在的不足,本發(fā)明提出一種環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法,以達(dá)到快速連接查詢、降低生成連接表時(shí)間,加快運(yùn)算速度的目的。本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的一種環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法, 包括以下步驟步驟1 建立Key-Value數(shù)據(jù)庫(kù),所述Key-Value數(shù)據(jù)庫(kù)由表組成,確定數(shù)據(jù)庫(kù)中表的關(guān)鍵列,所述的關(guān)鍵列是指作為表連接條件的列;步驟2 構(gòu)建關(guān)鍵列的列值索引并將其存儲(chǔ)到數(shù)據(jù)庫(kù)中,方法如下步驟2-1 構(gòu)建列值索引的方法為首先需要分別對(duì)不同表的關(guān)鍵列建立列值索弓丨,所述的列值索引是一個(gè)新的表,在列值索引中,每一行的關(guān)鍵字是原數(shù)據(jù)表中關(guān)鍵列的列值,對(duì)應(yīng)行下的列名為原數(shù)據(jù)表中對(duì)應(yīng)行的關(guān)鍵字,且列值為空;步驟2-2 采用分布式存儲(chǔ)方式存儲(chǔ)列值索引,即對(duì)于索引中每一行數(shù)據(jù),按照關(guān)鍵字進(jìn)行哈希,采用分布式哈希方法存儲(chǔ)到集群中對(duì)應(yīng)節(jié)點(diǎn)上;步驟2-3 步驟2-2所述的每個(gè)節(jié)點(diǎn)上,對(duì)本地存儲(chǔ)的不同表的關(guān)鍵列的列值索引片段建立同一個(gè)B樹索引,維護(hù)在內(nèi)存當(dāng)中;所述B樹索引的建立規(guī)則如下B樹索引維護(hù)在內(nèi)存當(dāng)中,其關(guān)鍵字與列值索引中的關(guān)鍵字相同,內(nèi)容為包含兩個(gè)整型標(biāo)志位的一維數(shù)組,所述一維數(shù)組的每一整型標(biāo)志位對(duì)應(yīng)步驟1所述的數(shù)據(jù)庫(kù)中的一個(gè)表,標(biāo)志位均初始化為0 ;所述B樹索引的建立方法如下對(duì)任意本地節(jié)點(diǎn)i,在不同列值索引中插入一個(gè)關(guān)鍵字為k的數(shù)據(jù),首先需要在B樹索引中查詢?cè)撽P(guān)鍵字k,如果沒有該關(guān)鍵字則對(duì)B樹索引插入該關(guān)鍵字,并將所述一維數(shù)組中與該表對(duì)應(yīng)的標(biāo)志位加1,如果存在該關(guān)鍵字,則只對(duì)與該表對(duì)應(yīng)的標(biāo)志位加1 ;當(dāng)一個(gè)關(guān)鍵字k的標(biāo)志位都不為0時(shí),說(shuō)明兩個(gè)列值索引中都至少包含一條關(guān)鍵字為k的數(shù)據(jù),即該關(guān)鍵字k符合連接條件,所以將其插入鏈表list中;步驟3 生成預(yù)連接表,方法為將步驟2-3中得到的鏈表list中的所有關(guān)鍵字都讀取出來(lái),對(duì)于每一個(gè)關(guān)鍵字V,分別對(duì)兩個(gè)關(guān)鍵列的列值索引讀取關(guān)鍵字為ν的列名的集合,對(duì)讀出的兩個(gè)列值索引的列名集合做笛卡爾積,得到符合連接條件的兩個(gè)原數(shù)據(jù)表中的關(guān)鍵字對(duì)的集合,對(duì)于每一個(gè)關(guān)鍵字對(duì),回溯到原數(shù)據(jù)表中取出相應(yīng)行的數(shù)據(jù)進(jìn)行連接, 即得到了預(yù)連接表;步驟4:若原數(shù)據(jù)表進(jìn)行更新,則對(duì)相應(yīng)預(yù)連接表進(jìn)行更新,否則,執(zhí)行步驟5,所述的對(duì)相應(yīng)預(yù)連接表進(jìn)行更新,方法為步驟4-1 對(duì)列值索引進(jìn)行更新,更新操作包括刪除操作和插入操作,所述刪除操作,即刪除表中關(guān)鍵字為k行下的列col,方法為先讀取該列下的列值v,接下來(lái)對(duì)表執(zhí)行關(guān)鍵字為k,列名為col的刪除操作,同時(shí)對(duì)列值索引執(zhí)行關(guān)鍵字為V,列名為k的刪除操作;所述的插入操作,即在表中插入關(guān)鍵字為k1;列名為col,列值為V1的數(shù)據(jù)時(shí),首先讀取表中關(guān)鍵字為k1;列名為col的值V,若ν為空,則是全新的寫入操作,這樣只需對(duì)表執(zhí)行關(guān)鍵字為k1;列名為col,列值為V1的寫入操作,同時(shí)對(duì)列值索引執(zhí)行關(guān)鍵字為Vl,列名為 Ic1的寫入操作;若ν不為空,則是一條修改操作,在表寫入新數(shù)據(jù),同時(shí)在列值索引中,刪除關(guān)鍵字為V,列名ki的舊數(shù)據(jù),寫入關(guān)鍵字為V1,列名為ki的新數(shù)據(jù);步驟4-2 對(duì)B樹索引和預(yù)連接表進(jìn)行更新,方法如下①關(guān)鍵列更新,包括關(guān)鍵列的插入和刪除,所述關(guān)鍵列的插入,即在表1插入了關(guān)鍵字為k1;列名為Col1,列值為V1的數(shù)據(jù),方法為對(duì)于該列值索引,按關(guān)鍵字V1哈希找到存儲(chǔ)節(jié)點(diǎn)位置,在節(jié)點(diǎn)本地,查找B樹索引,將關(guān)鍵字V1對(duì)應(yīng)第一個(gè)表的標(biāo)志位加1,判斷第二個(gè)表對(duì)應(yīng)的標(biāo)志位是否為0,如果不為0,則在節(jié)點(diǎn)本地讀取第二個(gè)表的列值索引中關(guān)鍵字為V1的所有列名的集合keys,對(duì)于keys中的每一個(gè)元素k,作第一個(gè)表中關(guān)鍵字為Ic1的數(shù)據(jù)與第二個(gè)表中關(guān)鍵字為k的數(shù)據(jù)的連接;關(guān)鍵列的刪除,即第一個(gè)表刪除關(guān)鍵字為k1;列名為COl1的數(shù)據(jù),此時(shí),首先讀取該列下的列值值V1,接著對(duì)于表1的列值索引按關(guān)鍵字V1哈希找到存儲(chǔ)節(jié)點(diǎn)位置,在節(jié)點(diǎn)本地,查找B樹索引,將關(guān)鍵字V1對(duì)應(yīng)第一個(gè)表的標(biāo)志位減1,接著判斷第二個(gè)表的標(biāo)志位是否為0,如果不為0,則在節(jié)點(diǎn)本地讀取第二個(gè)表的列值索引中關(guān)鍵字為V1的所有列名的集合keys,對(duì)于keys中的每一個(gè)元素k,對(duì)連接結(jié)果表中關(guān)鍵字為k^k的行進(jìn)行刪除;②非關(guān)鍵列變化,這種情況,列值索引和每個(gè)節(jié)點(diǎn)上的B樹索引都不需要更新,對(duì)第一個(gè)表中關(guān)鍵字為&的非關(guān)鍵列col進(jìn)行插入或刪除首先對(duì)表1讀取關(guān)鍵字為Ic1,關(guān)鍵列的列值V1,接下來(lái)對(duì)表2的列值索引按關(guān)鍵字為V1讀取列名集合keys,如果為空則結(jié)束,不為空則對(duì)keys中的每一個(gè)元素k,在結(jié)果表中對(duì)關(guān)鍵字ki_k的行中對(duì)應(yīng)的列進(jìn)行相應(yīng)的變動(dòng);
步驟5 進(jìn)行數(shù)據(jù)查詢,輸出查詢結(jié)果;步驟2所述一維數(shù)組的長(zhǎng)度與步驟1中所述的數(shù)據(jù)庫(kù)中的表個(gè)數(shù)相等,且至少為 2個(gè);步驟3所述的預(yù)連接表的命名規(guī)則如下結(jié)果表名為< 表1的名字>_<關(guān)鍵列的名字>_<表2的名字>_<關(guān)鍵列的名字 >,如果第一個(gè)表中關(guān)鍵字為Ic1行與第二個(gè)表中關(guān)鍵字為ka行發(fā)生連接,則生成的新行關(guān)鍵字為1^_1^。本發(fā)明優(yōu)點(diǎn)采用本發(fā)明的預(yù)連接表生成方法,可以在環(huán)形架構(gòu)的Key-Value數(shù)據(jù)庫(kù)中高效的生成預(yù)連接表,提供快速的連接查詢功能;通過優(yōu)化計(jì)算過程,降低了生成連接表的時(shí)間空間代價(jià),加快了計(jì)算速度;同時(shí)根據(jù)更新維護(hù)方法,降低了查詢延遲,可以提供實(shí)時(shí)的連接查詢結(jié)果。
圖1為本發(fā)明環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法總流程圖;圖2為本發(fā)明環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法與一般方法運(yùn)行時(shí)間對(duì)比圖;圖3為本發(fā)明環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法連接查詢的響應(yīng)時(shí)間圖;圖4為本發(fā)明環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法在分布式環(huán)境下各節(jié)點(diǎn)的數(shù)據(jù)分布圖;圖5為本發(fā)明環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法在各節(jié)點(diǎn)上運(yùn)行時(shí)間圖。
具體實(shí)施例方式下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)說(shuō)明。本實(shí)施例要實(shí)現(xiàn)手機(jī)用戶對(duì)訂閱圖書信息的查詢,給出一個(gè)查詢條件為查詢訂閱《老人與?!愤@本書的手機(jī)用戶的姓名。采用Key-Value數(shù)據(jù)庫(kù)存儲(chǔ)手機(jī)用戶信息和用戶訂閱圖書信息,如表1和表2所示表1為手機(jī)用戶信息表user
權(quán)利要求
1. 一種環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法,其特征在于包括以下步驟 步驟1 建立Key-Value數(shù)據(jù)庫(kù),所述Key-Value數(shù)據(jù)庫(kù)由表組成,確定數(shù)據(jù)庫(kù)中表的關(guān)鍵列,所述的關(guān)鍵列是指作為表連接條件的列;步驟2 構(gòu)建關(guān)鍵列的列值索引并將其存儲(chǔ)到數(shù)據(jù)庫(kù)中,方法如下 步驟2-1 構(gòu)建列值索引的方法為首先需要分別對(duì)不同表的關(guān)鍵列建立列值索引,所述的列值索引是一個(gè)新的表,在列值索引中,每一行的關(guān)鍵字是原數(shù)據(jù)表中關(guān)鍵列的列值, 對(duì)應(yīng)行下的列名為原數(shù)據(jù)表中對(duì)應(yīng)行的關(guān)鍵字,且列值為空;步驟2-2 采用分布式存儲(chǔ)方式存儲(chǔ)列值索引,即對(duì)于索引中每一行數(shù)據(jù),按照關(guān)鍵字進(jìn)行哈希,采用分布式哈希方法存儲(chǔ)到集群中對(duì)應(yīng)節(jié)點(diǎn)上;步驟2-3 步驟2-2所述的每個(gè)節(jié)點(diǎn)上,對(duì)本地存儲(chǔ)的不同表的關(guān)鍵列的列值索引片段建立同一個(gè)B樹索引,維護(hù)在內(nèi)存當(dāng)中;所述B樹索引的建立規(guī)則如下B樹索引維護(hù)在內(nèi)存當(dāng)中,其關(guān)鍵字與列值索引中的關(guān)鍵字相同,內(nèi)容為包含兩個(gè)整型標(biāo)志位的一維數(shù)組,所述一維數(shù)組的每一整型標(biāo)志位對(duì)應(yīng)步驟1所述的數(shù)據(jù)庫(kù)中的一個(gè)表,標(biāo)志位均初始化為0 ;所述B樹索引的建立方法如下對(duì)任意本地節(jié)點(diǎn)i,在不同列值索引中插入一個(gè)關(guān)鍵字為k的數(shù)據(jù),首先需要在B樹索引中查詢?cè)撽P(guān)鍵字k,如果沒有該關(guān)鍵字則對(duì)B樹索引插入該關(guān)鍵字,并將所述一維數(shù)組中與該表對(duì)應(yīng)的標(biāo)志位加1,如果存在該關(guān)鍵字,則只對(duì)與該表對(duì)應(yīng)的標(biāo)志位加1 ;當(dāng)一個(gè)關(guān)鍵字k的標(biāo)志位都不為0時(shí),說(shuō)明兩個(gè)列值索引中都至少包含一條關(guān)鍵字為k的數(shù)據(jù),即該關(guān)鍵字k符合連接條件,將其插入鏈表list中;步驟3 生成預(yù)連接表,方法為將步驟2-3中得到的鏈表list中的所有關(guān)鍵字都讀取出來(lái),對(duì)于每一個(gè)關(guān)鍵字v,分別對(duì)兩個(gè)關(guān)鍵列的列值索引讀取關(guān)鍵字為ν的列名的集合, 對(duì)讀出的兩個(gè)列值索引的列名集合做笛卡爾積,得到符合連接條件的兩個(gè)原數(shù)據(jù)表中的關(guān)鍵字對(duì)的集合,對(duì)于每一個(gè)關(guān)鍵字對(duì),回溯到原數(shù)據(jù)表中取出相應(yīng)行的數(shù)據(jù)進(jìn)行連接,即得到了預(yù)連接表;步驟4 若原數(shù)據(jù)表進(jìn)行更新,則對(duì)相應(yīng)預(yù)連接表進(jìn)行更新,否則,執(zhí)行步驟5,所述的對(duì)相應(yīng)預(yù)連接表進(jìn)行更新,方法為步驟4-1 對(duì)列值索引進(jìn)行更新,更新操作包括刪除操作和插入操作, 所述刪除操作,即刪除表中關(guān)鍵字為k行下的列col,方法為先讀取該列下的列值V, 接下來(lái)對(duì)表執(zhí)行關(guān)鍵字為k,列名為col的刪除操作,同時(shí)對(duì)列值索引執(zhí)行關(guān)鍵字為v, 列名為k的刪除操作;所述的插入操作,即在表中插入關(guān)鍵字為k1;列名為col,列值為V1的數(shù)據(jù)時(shí),首先讀取表中關(guān)鍵字為k1;列名為col的值v,若ν為空,則是全新的寫入操作,只需對(duì)表執(zhí)行關(guān)鍵字為k1;列名為col,列值為V1的寫入操作,同時(shí)對(duì)列值索引執(zhí)行關(guān)鍵字為V1,列名為Ic1的寫入操作;若ν不為空,則是一條修改操作,在表寫入新數(shù)據(jù),同時(shí)在列值索引中,刪除關(guān)鍵字為v,列名Ic1的舊數(shù)據(jù),寫入關(guān)鍵字為V1,列名為Ic1的新數(shù)據(jù); 步驟4-2 對(duì)B樹索引和預(yù)連接表進(jìn)行更新,方法如下①關(guān)鍵列更新,包括關(guān)鍵列的插入和刪除,所述關(guān)鍵列的插入,即在表1插入了關(guān)鍵字為k1;列名為Col1,列值為V1的數(shù)據(jù),方法為對(duì)于該列值索引,按關(guān)鍵字V1哈希找到存儲(chǔ)節(jié)點(diǎn)位置,在節(jié)點(diǎn)本地,查找B樹索引,將關(guān)鍵字V1對(duì)應(yīng)第一個(gè)表的標(biāo)志位加1,判斷第二個(gè)表對(duì)應(yīng)的標(biāo)志位是否為0,如果不為0,則在節(jié)點(diǎn)本地讀取第二個(gè)表的列值索引中關(guān)鍵字為V1 的所有列名的集合keys,對(duì)于keys中的每一個(gè)元素k,作第一個(gè)表中關(guān)鍵字為Iq的數(shù)據(jù)與第二個(gè)表中關(guān)鍵字為k的數(shù)據(jù)的連接;關(guān)鍵列的刪除,即第一個(gè)表刪除關(guān)鍵字為k1;列名為Col1的數(shù)據(jù),方法為首先讀取該列下的列值V1,接著對(duì)于表1的列值索引按關(guān)鍵字V1哈希找到存儲(chǔ)節(jié)點(diǎn)位置,在節(jié)點(diǎn)本地, 查找B樹索引,將關(guān)鍵字V1對(duì)應(yīng)第一個(gè)表的標(biāo)志位減1,接著判斷第二個(gè)表的標(biāo)志位是否為0,如果不為0,則在節(jié)點(diǎn)本地讀取第二個(gè)表的列值索引中關(guān)鍵字為V1的所有列名的集合 keys,對(duì)于keys中的每一個(gè)元素k,對(duì)連接結(jié)果表中關(guān)鍵字為k^k的行進(jìn)行刪除;②非關(guān)鍵列變化,這種情況,列值索引和每個(gè)節(jié)點(diǎn)上的B樹索引都不需要更新,對(duì)第一個(gè)表中關(guān)鍵字為Ic1的非關(guān)鍵列col進(jìn)行插入或刪除首先對(duì)表1讀取關(guān)鍵字為k1;關(guān)鍵列的列值V1,接下來(lái)對(duì)表2的列值索引按關(guān)鍵字為V1讀取列名集合keys,如果為空則結(jié)束,不為空則對(duì)keys中的每一個(gè)元素k,在結(jié)果表中對(duì)關(guān)鍵字ki_k的行中對(duì)應(yīng)的列進(jìn)行變動(dòng); 步驟5 進(jìn)行數(shù)據(jù)查詢,輸出查詢結(jié)果。
2.根據(jù)權(quán)利要求1所述的環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法,其特征在于步驟2 所述一維數(shù)組的長(zhǎng)度與步驟1中所述的數(shù)據(jù)庫(kù)中的表個(gè)數(shù)相等,且至少為2個(gè)。
全文摘要
一種環(huán)形架構(gòu)數(shù)據(jù)庫(kù)上預(yù)連接表的生成方法,屬于分布式數(shù)據(jù)存儲(chǔ)領(lǐng)域,方法為建立Key-Value數(shù)據(jù)庫(kù);構(gòu)建關(guān)鍵列的列值索引并將其存儲(chǔ)到數(shù)據(jù)庫(kù)中;生成預(yù)連接表;若原數(shù)據(jù)表進(jìn)行更新,則對(duì)相應(yīng)預(yù)連接表進(jìn)行更新;進(jìn)行數(shù)據(jù)查詢,輸出查詢結(jié)果;采用本發(fā)明的預(yù)連接表生成方法,可以在環(huán)形架構(gòu)的Key-Value數(shù)據(jù)庫(kù)中高效的生成預(yù)連接表,提供快速的連接查詢功能;通過優(yōu)化計(jì)算過程,降低了生成連接表的時(shí)間空間代價(jià),加快了計(jì)算速度;同時(shí)根據(jù)更新維護(hù)方法,降低了查詢延遲,可以提供實(shí)時(shí)的連接查詢結(jié)果。
文檔編號(hào)G06F17/30GK102323947SQ20111026084
公開日2012年1月18日 申請(qǐng)日期2011年9月5日 優(yōu)先權(quán)日2011年9月5日
發(fā)明者于戈, 寇月, 王習(xí)特, 王振華, 申德榮, 聶鐵錚, 鮑玉斌 申請(qǐng)人:東北大學(xué)