亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

如何將SQL數(shù)據(jù)映射到KV數(shù)據(jù)庫(kù)

cuieney / 3848人閱讀

摘要:同時(shí),目錄層還可以將表的元數(shù)據(jù)轉(zhuǎn)換到該二進(jìn)制前綴。默認(rèn)有一個(gè)根目錄,目錄名叫,包含所有層用到的所有鍵,下層目錄叫做,用于區(qū)數(shù)據(jù)和元數(shù)據(jù)。

日常吐槽

國(guó)外文章也不是都是好文章啊,不要見(jiàn)到英文就覺(jué)得高大上了……

前言

越來(lái)越多的關(guān)系型數(shù)據(jù)庫(kù)底層選擇基于KV構(gòu)建,例如TiDB的TiKV(RocksDB),cockroach的levelDB,MySQL的tokudb,以及被蘋(píng)果墻掉的FoundationDB。本文搶救出一篇FoundationDB的參考文章。

蘋(píng)果買下FoundationDB后,F(xiàn)oundationDB的所有公開(kāi)數(shù)據(jù)均被刪除,包括Github,pypi,twitter等。

本文包含如下內(nèi)容:

如何將關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)存入KV數(shù)據(jù)庫(kù)

能否直接用KV數(shù)據(jù)庫(kù)的接口讀取數(shù)據(jù)

能否對(duì)KV數(shù)據(jù)庫(kù)直接寫(xiě)數(shù)據(jù),并用SQL讀出修改后的數(shù)據(jù)

CockroachDB是如何做的

TiDB是如何做的

如何將關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)存入KV數(shù)據(jù)庫(kù)

簡(jiǎn)單來(lái)說(shuō),F(xiàn)oundationDB的SQL層將數(shù)據(jù)庫(kù)的元數(shù)據(jù)(metadata)作為鍵,將對(duì)應(yīng)的數(shù)據(jù)作為值存入KV數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)表的有三種序列化方式,默認(rèn)是foundationDB的tuple方式,當(dāng)然,也可以選擇使用protobuf序列化,或者使用column_keys的格式進(jìn)行序列化,本文也只介紹foundationDB原生的序列化tuple序列化方式。

KV數(shù)據(jù)庫(kù)中的鍵是有序排列的,所有的庫(kù)、表、列甚至索引對(duì)應(yīng)的元數(shù)據(jù)由對(duì)應(yīng)的目錄層在KV數(shù)據(jù)庫(kù)中存儲(chǔ)成類似etcd中的“目錄結(jié)構(gòu)”的形式。目錄層對(duì)數(shù)據(jù)庫(kù)中的每個(gè)庫(kù)、表、列生成對(duì)應(yīng)的二進(jìn)制字符串,該字符串在將關(guān)系型的數(shù)據(jù)映射到KV數(shù)據(jù)庫(kù)時(shí)作為區(qū)分庫(kù)、表、列的前綴。同時(shí),目錄層還可以將表的元數(shù)據(jù)轉(zhuǎn)換到該二進(jìn)制前綴。

如下實(shí)例解釋文中提到的目錄層如何工作。

CREATE TABLE schema_a.table_name_1(id INT PRIMARY KEY, c CHAR(10));
CREATE TABLE schema_a.table_name_2(id INT PRIMARY KEY);

默認(rèn)有一個(gè)根目錄,目錄名叫sql,包含所有SQL層用到的所有鍵,下層目錄叫做data,用于區(qū)數(shù)據(jù)和元數(shù)據(jù)。再下層目錄叫做table,用于區(qū)分表內(nèi)容和序列數(shù)據(jù)(sequence data)。table目錄中的所有下一級(jí)的目錄均為邏輯庫(kù)(schema)的目錄,邏輯庫(kù)的下一級(jí)目錄為邏輯表(table)的目錄。

Directory Tuple Raw Key
sql / (9) x15x09
sql / data / (3) x15x03
sql / data / table / (31) x15x1F
sql / data / table / schema_a / (228) x15xE4
sql / data / table / schema_a / table_name_1 / (215) x15xD7
sql / data / table / schema_a / table_name_2 / (247) x15xF7

當(dāng)使用tuple序列化方式時(shí),一行的數(shù)據(jù)被存儲(chǔ)為一個(gè)鍵值對(duì),鍵由上面提到的目錄的“二進(jìn)制前綴”,table在Table-Group中的位置和主鍵組成,值便是由這條記錄所有的列的進(jìn)行序列化后的值。

例如:對(duì)上面兩張表插入幾條數(shù)據(jù),對(duì)應(yīng)的SQL和對(duì)應(yīng)的鍵值對(duì)如下:

INSERT INTO schema_a.table_name_1 VALUES (1, "hello"), (2, "world");
INSERT INTO schema_a.table_name_2 VALUES (5);
二進(jìn)制鍵 tuple形式的鍵 二進(jìn)制值 tuple形式表示的值
x15xD7x15x01x15x01 (215, 1, 1) x15x01x02hellox00 (1, ‘hello’)
x15xD7x15x01x15x02 (215, 1, 2) x15x02x02worldx00 (2, ‘world’)
x15xF7x15x01x15x05 (247, 1, 5) x15x05 (5)
能否直接用KV數(shù)據(jù)庫(kù)的接口讀取數(shù)據(jù)

簡(jiǎn)單回答:能。

能否對(duì)KV數(shù)據(jù)庫(kù)直接寫(xiě)數(shù)據(jù),并用SQL讀出修改后的數(shù)據(jù)

安全性上來(lái)說(shuō),不能。FoundationDB數(shù)據(jù)不僅僅包含數(shù)據(jù)層,修改目錄層的數(shù)據(jù),很容易就會(huì)導(dǎo)致系統(tǒng)異常,例如缺少索引,缺少約束,缺少數(shù)據(jù)可元信息的驗(yàn)證。

CockroachDB是如何做的

CockroachDB中每個(gè)表都必須有主鍵,如果沒(méi)有的話,默認(rèn)也要生成一個(gè)。和FoundationDB一樣,所有的表都會(huì)被映射為KV數(shù)據(jù)庫(kù)中的鍵前綴。

每一列或者列族(column family)在KV數(shù)據(jù)庫(kù)中,都會(huì)被序列化成一個(gè)值,并且作為KV數(shù)據(jù)庫(kù)中的后綴。

例如:

在mydb下面創(chuàng)建表customers,包含兩個(gè)列,一個(gè)列是name,一個(gè)列是URL,cockroach會(huì)在數(shù)據(jù)庫(kù)中存儲(chǔ)如下的schema信息:

Key Values
/system/databases/mydb/id 51
/system/tables/customer/id 42
/system/desc/51/42/address 69
/system/desc/51/42/url 66

數(shù)據(jù)庫(kù)mydb的id是51,表customer的id是42,列address的id是69,列url的id是66。

和FoundationDB不通,cockroachDB中一個(gè)鍵值對(duì)存儲(chǔ)的是一條記錄中某一列的值。

Key Values
/51/42/Apple/69 1 Infinite Loop, Cupertino, CA
/51/42/Apple/66 http://apple.com/

前綴/51/42,表示mydb庫(kù)的customer表,/Apple表示主鍵值為Apple/66/69表示對(duì)應(yīng)的列。

TiDB是如何做的

TiDB沒(méi)有給出具體的方案,但是給出了一個(gè)大概的方案:

INSERT INTO user VALUES (1, "bob", "huang@pingcap.com");

INSERT INTO user VALUES (2, "tom", "tom@pingcap.com");

鍵存儲(chǔ)的是表名+索引,值存儲(chǔ)的是該條記錄所有列的內(nèi)容。

總結(jié)

RDBMS映射到KV比較簡(jiǎn)單,基本為:

KV中的鍵:唯一ID,通常能定位到一條記錄,或者一條記錄中的一個(gè)字段。但是,通常會(huì)映射、壓縮。
KV中的值:對(duì)應(yīng)序列化后的一條記錄,或者一條記錄中的一個(gè)字段。

另外,KV數(shù)據(jù)庫(kù)中不僅僅存儲(chǔ)著表的內(nèi)容,還會(huì)存儲(chǔ)著優(yōu)化后的索引等許多東西。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/17580.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<