本發明專利技術實施例提供了一種無模式數據存儲方法、裝置、計算機設備及介質,涉及數據存儲技術領域,方法包括:接收json數據,json數據達到預設行時形成第一數據塊;將第一數據塊內每個key所對應的鍵值均轉換為原生類型,形成第二數據塊;將第二數據塊內每個key的keyname轉換為keyid,不同的keyname所對應的keyid不同;將第二數據塊內同一個keyid所對應的所有原生類型的鍵值分配至同一數據組,形成第三數據塊;對第三數據塊生成數據標識,數據標識用于對第三數據塊進行定位以及與第三數據塊內的數據一一對應;對第三數據塊和數據標識分別進行存儲。該方案有效提升了數據處理效率。該方案有效提升了數據處理效率。該方案有效提升了數據處理效率。
【技術實現步驟摘要】
無模式數據存儲方法、裝置、計算機設備及介質
[0001]本專利技術涉及數據存儲
,特別涉及一種無模式數據存儲方法、裝置、計算機設備及介質。
技術介紹
[0002]關系型數據庫中把數據描述稱為關系,也經常被稱為表。一個表上可以有若干字段,每個字段有其固定的名稱與類型,而一個表上有哪些字段則需要由用戶預先進行明確的定義,一個關系中所有字段的字義稱為模式。
[0003]例如,可以把家庭中的電器定義為一種關系,并為其定義一些字段,字段可以是文本類型的“設備名稱”,布爾類型的“開關狀態”,浮點類型的“實時功耗”等。不同的電器類型可能各自有不同的專有屬性,比如冰箱有溫度信息,風扇有轉速信息。為了在這樣的關系中記錄這些信息,我們需要增加溫度與轉速兩種信息。但很可能某一天家里采購了電視,電視有其專用的音量屬性,為了把電視的信息存儲在家用電器關系中,需要增加音量字段,增加字段在關系型數據庫是合法的操作,但是其開銷巨大,不適合頻繁發生;增加字段需要用戶手工操作,無法自動進行,極大增加了用戶使用的復雜度;更重要的是關系型數據庫中每個關系的字段數存在上限,如果屬性總數超過此上限便無法通過上述方式存儲進關系中。
[0004]這種需要的字段無法預知,或者需要經常性調整,并且字段總數可能達到非常大規模的數據稱為無模式數據或弱模式數據,其與關系型數據庫的強模式模型存在天然的沖突。
[0005]針對上述問題在關系型數據庫中往往需要一些變通的解決方案,比如在PostgreSQL中提供了json數據類型,利用json object語法就可以靈活描述非關系型數據,比如 {"設備": "tv",
?“
開啟": true,
?“
音量": 15}。但是這種方法僅僅解決了功能有無的問題,無法與數據庫中其它功能進行適配,比如處理效率低,無法進行高效掃描,無法與向量化執行器搭配進行高效計算,無法與高效&高壓縮比的列存壓縮算法搭配,甚至無法高效取出存儲在其中的數據。
[0006]在PostgreSQL中已經存在一些如下的改進方案:jsonb:PostgreSQL中內置的二進制json類型,接受json格式的輸入內容,但內部把它轉換成二進制格式,可以更高效地提取給定key對應的值。缺點是占用比json更多的空間,且不易壓縮;并且與json類似,無法適配索引等高級功能。
[0007]hstore:更早期進行key
?
value數據存儲的嘗試,本質上與jsonb類似,即二進制的json類型,優缺點也都與jsonb相似。
[0008]zson:第三方提供的key
?
value數據存儲方案,本質上就是jsonb,但是借助外部字典把keyname轉換成整數,從而實現更高效的key查找。字典需要單獨根據采樣數據進行訓練,因此只適合固定的keyname集合,并不適合無模式數據,同樣無法適配索引等高級功能。
[0009]這些已有的方案的共同特點都是通過把json數據轉換成便于key查找的二進制格式來提升給定key的值的提取效率,但是它們都存在著無法突破json的本質、無法實現數據
類型原生化、處理效率低等技術問題。
技術實現思路
[0010]有鑒于此,本專利技術實施例提供了一種無模式數據存儲方法,以解決現有技術中無法實現數據類型原生化、處理效率低的技術問題。該方法包括:接收json數據,所述json數據達到預設行時形成第一數據塊;將所述第一數據塊內每個key所對應的鍵值均轉換為原生類型,形成第二數據塊;將所述第二數據塊內每個key的keyname轉換為keyid,所述keyname為鍵名,所述keyid為鍵名編碼,不同的keyname所對應的keyid不同;將所述第二數據塊內同一個keyid所對應的所有原生類型的鍵值分配至同一數據組,所述第二數據塊內所有keyid所對應的數據組形成第三數據塊;對所述第三數據塊生成數據標識,所述數據標識用于對所述第三數據塊進行定位以及與所述第三數據塊內的數據一一對應;對所述第三數據塊和所述數據標識分別進行存儲。
[0011]本專利技術實施例還提供了一種無模式數據存儲裝置,以解決了現有技術中無法實現數據類型原生化、處理效率低的技術問題。該裝置包括:分塊模塊,用于接收json數據,所述json數據達到預設行時形成第一數據塊;解析模塊,用于將所述第一數據塊內每個key所對應的鍵值均轉換為原生類型,形成第二數據塊;第一轉換模塊,用于將所述第二數據塊內每個key的keyname轉換為keyid,所述keyname為鍵名,所述keyid為鍵名編碼,不同的keyname所對應的keyid不同;分組模塊,用于將所述第二數據塊內同一個keyid所對應的所有原生類型的鍵值分配至同一數據組,所述第二數據塊內所有keyid所對應的數據組形成第三數據塊;數據標識生成模塊,用于對所述第三數據塊生成數據標識,所述數據標識用于對所述第三數據塊進行定位以及與所述第三數據塊內的數據一一對應;存儲模塊,用于對所述第三數據塊和所述數據標識分別進行存儲。
[0012]本專利技術實施例還提供了一種計算機設備,包括存儲器、處理器及存儲在存儲器上并可在處理器上運行的計算機程序,所述處理器執行所述計算機程序時實現上述任意的無模式數據存儲方法,以解決了現有技術中無法實現數據類型原生化、處理效率低的技術問題。
[0013]本專利技術實施例還提供了一種計算機可讀存儲介質,所述計算機可讀存儲介質存儲有執行上述任意的無模式數據存儲方法的計算機程序,以解決了現有技術中無法實現數據類型原生化、處理效率低的技術問題。
[0014]與現有技術相比,本說明書實施例采用的上述至少一個技術方案能夠達到的有益效果至少包括:接收json數據,json數據達到預設行時形成第一數據塊;將第一數據塊內每個key所對應的鍵值均轉換為原生類型,形成第二數據塊;將第二數據塊內每個key的keyname轉換為keyid,keyname為鍵名,keyid為鍵名編碼,不同的keyname所對應的keyid不同;將第二數據塊內同一個keyid所對應的所有原生類型的鍵值分配至同一數據組,第二數據塊內所有keyid所對應的數據組形成第三數據塊;對第三數據塊生成數據標識,數據標識
用于對第三數據塊進行定位以及與第三數據塊內的數據一一對應;對第三數據塊和數據標識分別進行存儲。本申請通過把同一keyname對應的鍵值分配至同一組,實現了把無模式數據存儲在有模式的關系表中,不需要顯式指定模式,也不要求固定的模式,且不受數據庫中字段數量的限制;通過對keyname進行鍵名編碼,有效減少了keyname的存儲開銷;將數據以原生類型進行存儲和讀取,不引入私有格式,可以利用數據庫中標準的SQL語句進行訪問,也即讀取時不需要額外的類型轉換,可以直接被數據庫訪問,通過數據庫執行器中相應的語義識別與下推,可以把“提取k2”這樣的語義轉換成原生關系表上的訪問,有效提升了處理效率;此外,把無模式數據以原生類型存儲在關系型的本文檔來自技高網...
【技術保護點】
【技術特征摘要】
1.一種無模式數據存儲方法,其特征在于,包括:接收json數據,所述json數據達到預設行時形成第一數據塊;將所述第一數據塊內每個key所對應的鍵值均轉換為原生類型,形成第二數據塊;將所述第二數據塊內每個key的keyname轉換為keyid,所述keyname為鍵名,所述keyid為鍵名編碼,不同的keyname所對應的keyid不同;將所述第二數據塊內同一個keyid所對應的所有原生類型的鍵值分配至同一數據組,所述第二數據塊內所有keyid所對應的數據組形成第三數據塊;對所述第三數據塊生成數據標識,所述數據標識用于對所述第三數據塊進行定位以及與所述第三數據塊內的數據一一對應;對所述第三數據塊和所述數據標識分別進行存儲。2.如權利要求1所述無模式數據存儲方法,其特征在于,對所述第三數據塊生成數據標識,包括:對所述第一數據塊分配塊編號,不同的第一數據塊所對應的塊編號不同;對所述第三數據塊基于所述塊編號生成數據標識,所述數據標識用于對所述第三數據塊進行定位以及與所述第三數據塊內的數據一一對應。3.如權利要求1所述無模式數據存儲方法,其特征在于,所述將所述第一數據塊內每個key所對應的鍵值均轉換為原生類型,形成第二數據塊,包括:對所述第一數據塊內的json數據進行逐行解析;對每行的每個key所對應的鍵值均轉換為原生類型,形成第二數據塊。4.如權利要求1所述無模式數據存儲方法,其特征在于,對所述第三數據塊進行存儲,包括:所述第三數據塊采用窄表模型進行存儲,所述窄表模型的內部關系表的模式按照PostgreSQL 語法描述為:CREATE TABLE data (bl...
【專利技術屬性】
技術研發人員:于寧,姚延棟,高小明,翁巖青,
申請(專利權)人:北京四維縱橫數據技術有限公司,
類型:發明
國別省市:
還沒有人留言評論。發表了對其他瀏覽者有用的留言會獲得科技券。