![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据库实现
翻译数据库实现的教程。
RadiumYang
ACM退役打牌选手
展开
-
简单数据库实现——Part13 - 更新父节点
简单数据库实现——Part13 - 更新父节点接下来一步,我们将处理在分裂叶节点后如何修复父节点。以下面的例子为参考:在我们的例子中,我们将key3添加到树中,这会导致左叶节点分裂。分裂之后我们将通过以下操作来修复树:将父节点中的第一个键更新为左孩子中的最大键(3)在更新key之后添加新的键指对新的指针指向新的子节点新键是新子节点中的最大键(5)因此,首先,用两个新的函数...原创 2020-02-09 14:42:40 · 298 阅读 · 0 评论 -
简单数据库实现——Part12 - 扫描多级B树
简单数据库实现——Part12 - 扫描多级B树我们现在支持构造一个多级B树,但是这破坏了select语句。下面是一个测试用例,他插入15行,然后尝试打印它们。+ it 'prints all rows in a multi-level tree' do+ script = []+ (1..15).each do |i|+ script << "ins...原创 2020-02-08 14:26:47 · 193 阅读 · 0 评论 -
简单数据库实现——Part11 - 递归搜索B树
简单数据库实现——Part11 - 递归搜索B树原创 2020-02-07 19:25:30 · 164 阅读 · 0 评论 -
简单数据库实现——Part10 - 分裂叶节点
简单数据库实现——Part10 - 分裂叶节点我们的B树现在只有一个节点,这看起来不像是一棵树。所以,我们需要一个将叶节点一分为二的函数,同时创建一个内部节点作为两个新的叶节点的父节点。我们的目标是从:转变为:这时我们不再需要叶节点已满的错误,先删去。 void leaf_node_insert(Cursor* cursor, uint32_t key, Row* value) {...原创 2020-02-06 11:21:11 · 290 阅读 · 0 评论 -
简单数据库实现——Part9 - 二分搜索和重复键
简单数据库实现——Part9 - 二分搜索和重复键上一部分我们的数据仍然没有排序,这个部分我们会修复这个问题,并检测和拒绝重复的键。现在,我们的execute_insert()函数总是在表的最后插入。而实际上我们应该在表中找到正确的位置插入,并且如果键已经存在,应该返回一个错误。ExecuteResult execute_insert(Statement* statement, Table*...原创 2020-02-03 13:58:19 · 137 阅读 · 0 评论 -
简单数据库实现——Part8 - B树的叶节点结构
简单数据库实现——Part8 - B树的叶节点结构我们正在将表的结构更改为B树。这是一个很大的变化,需要很多篇文章。本文中,我们将定义叶节点的布局,并支持将键值对插入到单节点树中。首先,我们来回顾一下切换到树形结构的原因。选择表结构使用当前的结构,每个页面只存储行,因此空间利用率很高,我们只在末尾追加,所以插入也很快。但是只能通过扫描整个表来查找特定的行。如果我们想删除一行,必须移动后面所有...原创 2020-01-31 22:09:18 · 586 阅读 · 0 评论 -
简单数据库实现——Part7 - B树简介
简单数据库实现——Part7 - B树简介对数据结构不太熟悉的话可以先补一下数据结构。B树是sqlite用来表示表和索引的数据结构,此处只介绍数据结构,没有任何代码。为什么树(tree)对数据库来说是一个好的数据结构?可以很快的查询特定值(对数时间复杂度)可以快速插入/删除已找到的数据(常数时间复杂度)遍历一个区间的至很快(与hash map的不同)B树不同于二叉树(B可能代表发...原创 2020-01-30 14:51:54 · 282 阅读 · 0 评论 -
简单数据库实现——Part6 - 游标抽象
简单数据库实现——Part6 - 游标抽象这部分只是做了一些重构,使更容易实现B树。我们将要新增一个表示表中某个位置的游标(cursor)对象。你可以对它进行如下操作:在表开头创建一个游标在表末尾创建一个游标访问游标指向的行游标移动到下一行之后我们还要实现的:删除游标指向的行修改游标指向的行搜索给点ID,创建一个指向该ID的游标下面是游标结构体:+typedef s...原创 2020-01-30 10:51:41 · 191 阅读 · 0 评论 -
简单数据库实现——Part5 - 持久存储到磁盘
简单数据库实现——Part5 - 持久存储到磁盘目前的数据库在终止程序重新启动后会丢失所有记录,所以我们会通过将整个数据库保存到一个文件来保存记录。我们已经通过将行序列化到页面大小的内存快中,为了增加持久性,我们可以简单的将内存块写入文件并在下次程序启动时读入内存。为了简化这一过程,我们将进行一个称为寻呼机(pager)的抽象。我们向寻呼机询问页码x,寻呼机返回给我们一块内存。它会首先查看他...原创 2020-01-29 21:49:01 · 275 阅读 · 0 评论 -
简单数据库实现——Part4 - 初次测试
简单数据库实现——Part4 - 初次测试我们现在已经能够插入行和打印所有行了,让我们花点时间来测试一下我们得到了什么。我将使用rspec来编写我的测试,因为我对它很熟悉(我不熟。。。),而且它的语法相当容易读。这里提一下rspec安装基本上按照官网来就行了,先要安装一个bundler。sudo apt install bundler然后创建一个文件Gemfilevim Gemfi...原创 2020-01-22 15:16:26 · 217 阅读 · 0 评论 -
简单数据库实现——Part3 - 一个内存存储-只可追加-单数据表的数据库
Part3 - 一个内存存储-只可追加-单数据表的数据库我们将先实现一个小规模的数据库。它现在可以做到:支持两种操作:插入一行和打印所有行仅驻留在内存中(没有磁盘永久性)支持单个硬编码(hard-coded)的数据表我们的硬编码表储存用户的如下信息:columetypeidintegerusernamevarchar(32)emailvarch...原创 2020-01-20 22:02:46 · 294 阅读 · 0 评论 -
简单数据库实现——Part2 - 世上最简单的SQL编译器和虚拟机
Part2 - 世上最简单的SQL编译器和虚拟机我们正在复现sqlite。sqlite的前端(front-end)是一个SQL编译器,它解析一个字符串并输出一个字节码。字节码被传递给虚拟机来处理它(Part1中有提到)。再看一下这个结构图,我们可以看到SQL Command Processer(SQL命令处理器)处理完数据后将字节码传递给Virtual Machine(虚拟机)。将事情分...原创 2020-01-20 15:48:06 · 432 阅读 · 0 评论 -
简单数据库实现——Part1 - REPL的简介和设置
Part1 - REPL的简介和设置思考目录中的问题,简而言之就是数据库是如何工作的,为了搞清楚这些问题,我正在从头开始编写一个数据库,他模仿了sqlite,因此他更小而且功能更少。为了更好的理解,整个数据库被存储在一个文件中。sqlitesqlite的网站上有很多文档,这里我给出一个sqlite的设计与实现的架构图。一个查询(query)通过一系列的组件来实现检索或修改数据。前端(f...原创 2020-01-20 14:44:12 · 325 阅读 · 0 评论 -
简单数据库实现——目录
一个简单数据库的实现用C复现一个sqlite翻译自:https://cstack.github.io/db_tutorial/翻译水平有限,请对照原文。数据库是如何工作的?数据以什么样的格式存储在内存(memory)和磁盘(disk)上?何时从内存转移到磁盘上?为什么一个表(table)只能有一个主键(primary key)?如何回滚事物(transaction)?索引的...原创 2020-01-20 13:06:59 · 327 阅读 · 0 评论