创建我自己的数据库系统


65

我需要学习数据库如何工作才能更有效地使用它们,而我的学习方式就是这样做。

我想创建自己的数据库系统。我并不是指创建一个使用查询来解析文件的伪数据库;这只是带有查询语言的文件系统接口。我说的是数据库引擎的实际结构。而且由于我的想法既不是关系型的也不是面向文档的(如果存在的话,它就是“面向节点的”),所以我需要任何资源尽可能抽象和高级。

那么我将如何去创建它呢?我可以阅读哪些资源/教程/书籍以了解?

语言一点都不重要。理想情况下,该代码应为伪代码以说明该概念,而不是与特定语言绑定,而是可以执行任何操作。我无法在Google上找到关于此事的任何信息(因为我对这个问题非常不了解,也许我只是没有输入正确的搜索字词)。

如果没有这样的资源,那么我想关于如何创建客户端的事情至少是朝正确方向迈出的一步。


15
为什么不编写编译器呢?甚至更好的是您自己的操作系统?如果您真的很想编写自己的数据库,那么这里有一千一百个开源数据库:研究它们的源代码,提供一些补丁。然后开始考虑建立自己的。
扬尼斯,

4
您可以参加一些大​​学水平和研究生水平的数据库课程。在线上有许多开源课程。您还可以购买一些教科书,并在业余时间学习它们。这将为您提供一些想法和起点。阅读有关PostgreSQL的历史和新闻也将有所帮助(就想象力而言,尽管它不会让您知道这些功能的实际实现方式)
rwong 2011年

9
I studied open-source DBs, but their codebase is too huge:如果像redisflockdb之类的东西太大而无法阅读,我看不出您将如何应付编写或拥有数据库。
yannis 2011年

10
@YannisRizos公平地说,阅读代码(imo)比自己编写代码困难得多。
AlexWebr 2011年

12
@Xananax:不要听青蛙(crystal-reflections.com/stories/story_73.htm)。做任何您喜欢的事情,在这个过程中没有必要以取乐为目标。

Answers:


61

(如果存在的话,它是“面向节点的”)

从这里开始。在处理诸如数据库之类的复杂应用程序(即使一个简单的数据库也是一个复杂的应用程序)时,您应该熟悉域的历史和适当的术语,并且至少对体系结构有一个非常高级的了解。您可以从Database上的Wikipedia文章开始。花了几天时间阅读有关相关概念和不同数据库类型的所有文章。

而且由于我的想法既不是关系型的也不是面向文档的

接下来,选择“ Relational”或“ NoSQl”。如果选择NoSQL,则应该选择一种NoSQL。这非常重要,您不会找到任何讨论所有不同数据库系列的体系结构文档。选择哪一个并不重要,只需选择一个并坚持下去即可。

语言一点都不重要。

是的(不幸的是),因为选择了数据库家族之后,您应该开始从该家族的开源数据库中探索代码。关于寻找的内容,有一些通用准则:

  • 相对较小的代码库,
  • 建筑文档或至少一个开发博客,
  • 您选择的数据库应该接近家族中通用的数据库,如果它的专业性很高,则很难从中学习。

一些合适的例子:

获取源代码,对其进行编译并使用它。您不必提交补丁或任何花哨的东西,只需浏览代码并在此处和此处进行小的改动,看看会发生什么。这是一个增量过程,您玩的越多,就越容易理解代码的作用。如果您选择的第一个项目似乎很难理解,那就继续进行下一个。

另一个不错的选择是专注于为MySQL构建引擎,如@NB在较早的答案中建议的那样

如果确实可以使用代码库做一些有用的事情,请加入项目社区,这是找到有关概念的更多详细资源的最简单方法。

然后,最后,开始处理您的数据库。起初,您可以编写一个非常精简的代码,以克隆您一直在探索的代码。它不一定是原始的,有很多很棒的项目以克隆或分叉开始。

我可以阅读哪些资源/教程/书籍以了解?

有很多书:

其他几百种,以及无数的学术论文,都可以通过Google轻松找到。您需要先定义要做什么,然后再搜索一本书。与数据库作者同行社区的参与也将帮助您缩小书籍的范围,并可能获得比上述更多的建议。

祝好运!完成后,我希望评论包含指向您的存储库的链接。而且,如果您从未做过,请确保留个言,提醒我,我还没有完成我2001年开始编写的编译器。


5
这是不错的帖子
Chani

2
太好了!甚至更多来自您的:)我想几乎接受彼此的答案,但是由于我必须选择一个答案,因此必须如此。I'm expecting a comment with a link to your repository when you're done: 明确地!再次感谢您和其他所有人,这真令人振奋。
Xananax 2011年

3
对于来这里寻求相同答案的任何人:我发现flockDB是学习的最佳人选,代码库非常小,代码可读性强(尽管我不会讲scala),而且易于理解。
Xananax 2011年

@Yannis,顺便说一句,您推荐的是哪几本书?
Pacerier,2014年

@Xananax Sooo怎么样了?我们可以看的任何存储库吗?:)
Radu Murzea

27

您应该这样做,不要过多思考。享受学习过程和热情是礼物。

问别人是否有好主意当然不是一个好策略。如果我听过所有青蛙的话,今天我仍然会在宜家工作,将购物车从停车场推到仓库。

您不必像Ayende在那篇有趣的文章中那样为自己辩护。问题是:

但是,作为一个务实的开发人员,我想知道这个项目在饱和市场中提供了哪些新功能,在这个市场中您有相当成熟的替代方案,例如CouchDB,MongoDB,Tokyo,Redis等?这些产品中的许多产品也是跨平台的,并且以可靠的记录以C速度运行,被用于非常大型的网站,这些网站的分片能力和容错能力已经大大提高。

如果您对过程感到满意,请不要担心目标,您已经赢了。


4
+1,非常有思想性和教学性答复:-) ...对想要做某事的人来说真的是一个很好的答案
Pankaj Upadhyay

的确很好。我快要接受这一点。我之所以没有这样做,是因为我认为yannis的回答更切合实际,并且更有可能帮助有相同问题的人们。但这绝对令人鼓舞。非常感谢。
Xananax 2011年

Yannis的回答比我的要好,值得您选择

6

“((即使存在,它也是“面向节点的”)”。-这可能就是为什么您找不到太多东西的原因!

深入了解版本0.1,并查看获得的地方。您可能会从尝试产生自己想要的东西中学到更多,也可以通过询问您“应该”做什么来学到更多。给它几天,然后查看您的位置。

大约18年前,我用btree索引编写了一个基本的数据库系统(为了娱乐,请看图),并学到了很多东西。


4

MySQL具有可插拔的存储引擎结构,检查一下如何创建引擎才能用于MySQL 可能是一个好主意。


4

听起来像一个伟大的项目。显然,您的目标不是创建生产软件,而是了解数据库和创建数据库系统的过程。

我真的不认为您需要做很多研究。看来目的是获得有关创建基于节点的数据库系统的经验。

这是我的入门方法:

  1. 选择您喜欢的语言或您想提高的语言。
  2. 创建节点对象(或与您的语言最接近的对象)。弄清楚如何链接它们。
  3. 简短列出您将首先实现的SQL语句。
  4. 确定如何保存数据。一种明显的解决方案是序列化所有节点,在程序启动时加载它们,并在程序结束时保存它们。

在掌握了基础知识之后,您将对困难或问题有更多的了解。然后,您可以对此进行一些研究,找到一些改进并将其集成。


1
我正在按照您建议的步骤进行操作。1,2,3没问题。但是,我为#4所困扰。在海量数据的情况下,如何仅将相关部分加载到内存中?我想到了将所有内容存储为二进制数据并保留另一个索引文件,但是如果用户不按索引查询怎么办?我仍然必须遍历整个文件...我想是时候
再问

为什么不将所有内容都存储在内存中?如果您专用1 GB,那将容纳大量数据。或者,将每个二进制数据节点存储在磁盘上,然后您将有1 GB的文本。那是很多文字。无论如何,我认为处理大于1GB的数据库并不是练习的中心。
B

此外,您可以创建许多方法来有效地在1 GB内存中工作。您可以稍后改进系统的该部分。一种解决方案是将所有节点信息加载到内存中,但将每个节点的数据存储在磁盘上。这样,您可以有效地遍历节点,并且仅访问磁盘以检索您真正需要的数据。
B

3

编写自己的数据库“以便了解其全部工作原理”是这样做的唯一好理由(因为数据库疯狂地难以正确设置,并且难以证明其正确性)。你疯了,但是很好!

为了了解它是如何完成的,建议您使用SQLite。在SQLite的源仅约1.3MB压缩,这是一个完全ACID兼容的事务数据库。它也是公共领域,主要作者是一个好人,我敢肯定他会很乐意回答您的问题。(我认为最棘手的进来如何真正地致力于信息到磁盘;说服操作系统和硬件停止说谎,真写的交易现在是相当困难,为什么我很高兴我从来没有写一个DB)。


1
SQLite的代码库接近0.2 * 10 ^ 6 LOC(5MB解压缩),这不是那个小。
yannis 2011年

1
@Yannis:与MySQL或PostgreSQL或任何其他服务器DB系统进行比较…
Donal Fellows


3

我需要学习数据库如何工作

学习关系代数。

找到一个小的数据库引擎,学习源代码。

为了更有效地使用它们

不。您需要学习如何有效地使用数据库。如果您了解汽车的工作原理,那么您可能会是一个更好的司机,但是如果您真正专注于驾驶,那么您将成为一个更好的司机。

走传统路线:走课程,看书,同行评议,提问,使用索引卢克


5
Learn relational algebra.假设op当然对关系数据库感兴趣...
yannis 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.