我一直想学习编程一会儿。 我研究Java和Python,和我很舒服与他们的语法。 最近,我想用我所用的编码从根本上有形软件教训。
我想实现一个数据库引擎,排序的的NoSQL数据库。 我已经把一个小文件,排序的规范跟随在我的编码它的冒险。 但我只知道是一堆关键字。 我不知道从哪里开始。
有人可以帮助我了解如何收集我需要这方面的工作,并以什么顺序来学习事物的知识呢? 我已经寻找的文件,但我觉得我会最终找到无关/错误内容或从错误点开始,因为实现一个完整的数据库引擎(似乎是)一个真正复杂的任务。
我wan't来表达,我宁愿论文和白皮书及(e)书籍到其他项目的代码,因为我问过其中的人通常得到的回答形式类型的问题“读项目- X”源代码”。 我不是在舒适的阅读和理解源代码的水平。
首先,你可以看看,答案为如何写一个简单的数据库引擎 。 虽然它专注于一个SQL引擎,还有很多答案好材料。
否则,一个好的项目教程是B树数据库类的实现 。 示例代码是C ++,但什么是做和为什么的描述可能是你想看看反正什么。
另外,还设计和实现结构化存储(数据库引擎)在MSDN上。 的信息有很多可以帮助你在你的学习项目。
由于接受的答案只提供(好)其他资源的链接,我还以为我分享我的经验写webdb ,对于浏览器的一个小规模的试验数据库。 我还请您阅读源代码。 这是非常小的。 您应该能够通过它来阅读,并得到它正在做什么在几个小时一个基本的了解。 警告 :我在这一个的n00b和自写它,我学到了很多关于它,看到我一直在做事情有些不对劲。 它可以帮助你虽然起步。
基础知识:B树
我开始了适应AVL树,以满足我的需求。 AVL树是一种平衡树的。 您存储密钥K和相关数据(如果有的话)中的一个节点,那么所有项目key < K
在左子树的节点,并与所有项目key > K
在右子树。 如果你想支持非唯一键,您可以使用一个数组来存储数据项。
这棵树会给你的基础知识: 创建 , 更新 , 删除和方式,通过键快速得到一个项目,或者与主要的所有项目<X,或X和Y之间等关键,这可以作为我们的表的索引。
一个模式
作为下一个步骤,我写的代码,可以让客户端代码中定义的模式。 类似的方法createTable()
等架构通常与SQL有关,但即使没有-SQL排序的有模式; 他们通常会要求你标记ID字段,你想搜索的任何其他领域。 你可以让你的架构花哨,只要你想,但你通常要至少哪一列(S)作为主键模型和领域将被频繁搜索,想要找一个索引。
创建一个数据结构来存储表
我决定用我创建的树中的第一步来存储我的项目。 这些都是简单的JS对象。 在定义该字段包含PK,我可以简单地插入项目为使用该字段的值作为键树。 这让我通过ID(范围)快速查找。
接下来,我添加了另一个树每个需要的索引列。 在这些树我没有保存完整的记录,但只有密钥。 因此,要获取按姓氏客户,我会先用在姓氏索引,以获得ID,然后主键索引,以获得实际的记录。 我之所以不只是存储(参考)实际的对象,因为它使组操作变得更加简单(见下一步)
查询
现在,我们已经与PK和搜索字段索引的表,我们就可以实现查询。 我并没有这样做很远,因为它很快变得复杂,但你可以只用一些基本得到一些不错的功能。 WebDB没有实现连接; 所有查询只能对一个表进行操作。 但是,一旦你明白这一点,你看到做了相当清楚的(虽然漫长而曲折的)路径连接和其他复杂的东西为好。
在WebDB,让所有的客户提供firstName = 'John'
和city = 'New York'
(假设这是两个搜索字段),你会写是这样的:
var webDb = ...
var johnsFromNY = webDb.customers.get({
firstName: 'John',
city: 'New York'
})
为了解决这个问题,我们首先做两个查找:我们得到的客户名为“约翰”的所有ID的集合X,我们得到来自纽约客户的所有ID的集合Y。 然后,我们在这两个集合执行交集得到的客户,都被命名为“约翰”, 并从纽约的所有ID。 然后我们通过一组产生的ID,得到实际的记录每一个并将其添加到结果数组的运行。
使用set运营商如工会和路口,我们可以进行AND和OR搜索。 我只是执行和 。
这样做会连接(我认为)涉及在内存中创建临时表,然后填充它们作为查询运行与加入的结果,然后将查询标准来临时表。 我从来没有在那里。 我尝试了一些同步的逻辑下一个但那是过于雄心勃勃,并从那里开始走下坡路:)