从头实现数据库-8

Date Unknown

行和列

在KV存储之上构建关系DB的第一步是添加表。表只是一堆行和列。列的子集被定义为“主键”;主键是唯一的,因此它们可以用于引用一行(在查询和辅助索引中)。
一张表是如何放进KV存储器的?我们可以把一行分成两部分:
  • 主键列进入KV存储的“键”部分。
  • 非主键列进入“值”部分
 

数据结构

下面是行和单元格的定义。目前,我们只支持两种数据类型(int64和bytes)。
数据库和表的定义:
为了支持多个表,KV存储区中的键以一个唯一的32位数字作为前缀。
表定义必须存储在某个地方,我们将使用一个内部表来存储它们。我们还将添加一个内部表来存储DB本身使用的元数据。

点查询

让我们通过主键实现点查询,范围查询将在下一章中添加。
程序是:
  • 确认输入是一个完整的主键。(checkRecord
  • 对主键进行编码。(encodeKey
  • 查询KV存储。(db.kv.Get)
  • 解码值。(decodeValues
将数据编码成字节和从字节解码的方法将在下一章中解释。目前,任何序列化方案都适用于本章。
要查询一个表,我们必须先得到它的定义。
该定义以JSON形式存储在内部表TDEF_TABLE中。

更新

更新可以插入新行或替换现有行。B树接口进行了修改,以支持不同的更新模式。
通过主键更新记录的功能:
不同的更新模式:
删除行与此类似:

创建新表

三个步骤:
  • 检查表定义。
  • 分配表键前缀。
  • 存储下一个表前缀和表定义。
前缀号是从TDEF META内部表的next prefix键开始递增分配的。表定义作为JSON存储在TDEF_TABLE表中。
虽然我们添加了表结构,但结果仍然是KV存储。缺少了一些重要的方面:
范围查询在下一章。
下一章中的二级索引。

Copyright © 2025 later

logo