国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何將SQL數據映射到KV數據庫

cuieney / 3770人閱讀

摘要:同時,目錄層還可以將表的元數據轉換到該二進制前綴。默認有一個根目錄,目錄名叫,包含所有層用到的所有鍵,下層目錄叫做,用于區數據和元數據。

日常吐槽

國外文章也不是都是好文章啊,不要見到英文就覺得高大上了……

前言

越來越多的關系型數據庫底層選擇基于KV構建,例如TiDB的TiKV(RocksDB),cockroach的levelDB,MySQL的tokudb,以及被蘋果墻掉的FoundationDB。本文搶救出一篇FoundationDB的參考文章。

蘋果買下FoundationDB后,FoundationDB的所有公開數據均被刪除,包括Github,pypi,twitter等。

本文包含如下內容:

如何將關系型數據庫的數據存入KV數據庫

能否直接用KV數據庫的接口讀取數據

能否對KV數據庫直接寫數據,并用SQL讀出修改后的數據

CockroachDB是如何做的

TiDB是如何做的

如何將關系型數據庫的數據存入KV數據庫

簡單來說,FoundationDB的SQL層將數據庫的元數據(metadata)作為鍵,將對應的數據作為值存入KV數據庫。數據庫表的有三種序列化方式,默認是foundationDB的tuple方式,當然,也可以選擇使用protobuf序列化,或者使用column_keys的格式進行序列化,本文也只介紹foundationDB原生的序列化tuple序列化方式。

KV數據庫中的鍵是有序排列的,所有的庫、表、列甚至索引對應的元數據由對應的目錄層在KV數據庫中存儲成類似etcd中的“目錄結構”的形式。目錄層對數據庫中的每個庫、表、列生成對應的二進制字符串,該字符串在將關系型的數據映射到KV數據庫時作為區分庫、表、列的前綴。同時,目錄層還可以將表的元數據轉換到該二進制前綴。

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

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);

默認有一個根目錄,目錄名叫sql,包含所有SQL層用到的所有鍵,下層目錄叫做data,用于區數據和元數據。再下層目錄叫做table,用于區分表內容和序列數據(sequence data)。table目錄中的所有下一級的目錄均為邏輯庫(schema)的目錄,邏輯庫的下一級目錄為邏輯表(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

當使用tuple序列化方式時,一行的數據被存儲為一個鍵值對,鍵由上面提到的目錄的“二進制前綴”,table在Table-Group中的位置和主鍵組成,值便是由這條記錄所有的列的進行序列化后的值。

例如:對上面兩張表插入幾條數據,對應的SQL和對應的鍵值對如下:

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

簡單回答:能。

能否對KV數據庫直接寫數據,并用SQL讀出修改后的數據

安全性上來說,不能。FoundationDB數據不僅僅包含數據層,修改目錄層的數據,很容易就會導致系統異常,例如缺少索引,缺少約束,缺少數據可元信息的驗證。

CockroachDB是如何做的

CockroachDB中每個表都必須有主鍵,如果沒有的話,默認也要生成一個。和FoundationDB一樣,所有的表都會被映射為KV數據庫中的鍵前綴。

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

例如:

在mydb下面創建表customers,包含兩個列,一個列是name,一個列是URL,cockroach會在數據庫中存儲如下的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

數據庫mydb的id是51,表customer的id是42,列address的id是69,列url的id是66。

和FoundationDB不通,cockroachDB中一個鍵值對存儲的是一條記錄中某一列的值。

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

前綴/51/42,表示mydb庫的customer表,/Apple表示主鍵值為Apple/66/69表示對應的列。

TiDB是如何做的

TiDB沒有給出具體的方案,但是給出了一個大概的方案:

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

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

鍵存儲的是表名+索引,值存儲的是該條記錄所有列的內容。

總結

RDBMS映射到KV比較簡單,基本為:

KV中的鍵:唯一ID,通常能定位到一條記錄,或者一條記錄中的一個字段。但是,通常會映射、壓縮。
KV中的值:對應序列化后的一條記錄,或者一條記錄中的一個字段。

另外,KV數據庫中不僅僅存儲著表的內容,還會存儲著優化后的索引等許多東西。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17580.html

相關文章

  • TiDB:支持 MySQL 協議的分布式數據庫解決方案

    摘要:編者按是國內團隊開發的一個分布式數據庫。國內最大的使用者是小米公司,有幾個的,所以經過一些修改后可以支持分布式事務,于是能夠解決之前的問題。對于分布式關系型數據庫,站在更上層一點看,比如谷歌的,數據庫底層都是層,都在層邏輯下操作。 【編者按】TiDB 是國內 PingCAP 團隊開發的一個分布式 SQL 數據庫。其靈感來自于 Google 的?F1,TiDB 支持包括傳統 RDBMS ...

    Yi_Zhi_Yu 評論0 收藏0

發表評論

0條評論

cuieney

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<