【问题标题】:How to write a simple database engine [closed]如何编写一个简单的数据库引擎 [关闭]
【发布时间】:2009-06-27 05:44:52
【问题描述】:

我有兴趣了解数据库引擎的工作原理(即它的内部结构)。我知道 CS 中教授的大多数基本数据结构(树、哈希表、列表等),并且对编译器理论有很好的理解(并且已经实现了一个非常简单的解释器),但我不明白该怎么做关于编写数据库引擎。我已经搜索了有关该主题的教程,但找不到任何教程,因此我希望其他人可以为我指明正确的方向。基本上,我想了解以下信息:

  • 数据在内部的存储方式(即表格的表示方式等)
  • 引擎如何找到它需要的数据(例如运行 SELECT 查询)
  • 如何以快速高效的方式插入数据

以及可能与此相关的任何其他主题。它不一定是磁盘数据库——即使是内存数据库也可以(如果更简单的话),因为我只想了解它背后的原理。

非常感谢您的帮助。

【问题讨论】:

标签: sql database theory database-engine


【解决方案1】:

如果您擅长阅读代码,那么学习 SQLite 将教会您大量有关数据库设计的知识。它很小,所以更容易把你的头包起来。但它也写得很专业。

SQLite 2.5.0 for Code Reading

http://sqlite.org/

【讨论】:

【解决方案2】:

这个问题的答案很大。期待一篇博士论文能得到 100% 的回答;) 但我们可以一一想到问题:

  • 如何在内部存储数据: 您应该有一个包含数据库对象的数据文件和一个缓存机制,以将焦点数据及其周围的一些数据加载到 RAM 中 假设您有一个包含一些数据的表,我们将创建一个数据格式来将此表转换为二进制文件,方法是同意列定界符和行定界符的定义,并确保这种定界符模式永远不会在您的数据本身。例如,如果您选择了 来分隔列,则应验证您放置在此表中的数据不包含此模式。您还可以通过指定行的大小和一些内部索引号来使用行标题和列标题来加快搜索速度,并在每列的开头使用该列的长度 像“亚当”、1、11.1、“123 ABC Street POBox 456” 你可以拥有它 Adam1111123 ABC Street POBox 456

  • 如何快速找到项目 尝试使用散列和索引来指向基于不同标准存储和缓存的数据 以上面相同的示例为例,您可以对第一列的值进行排序并将其存储在一个单独的对象中,该对象指向按字母顺序排序的项目的行 id,依此类推

  • 如何加速插入数据 我从 Oracle 了解到,他们在 RAM 和磁盘上的临时位置插入数据并定期进行内务处理,数据库引擎一直忙于优化其结构,但同时我们不想丢失数据类似的东西停电的情况下。 所以尽量将数据保存在这个临时的地方而不进行排序,附加你的原始存储,然后在系统空闲时使用你的索引并在完成后清除临时区域

祝你好运,伟大的项目。

【讨论】:

    【解决方案3】:

    Garcia-Molina、Ullman 和 Widom 撰写的 Database Systems: The Complete Book 是一个很好的起点

    【讨论】:

      【解决方案4】:

      SQLite 之前提到过,但我想补充一点。

      我个人通过学习 SQlite 学到了很多东西。有趣的是,我没有去看源代码(虽然我只是看了一眼)。通过阅读技术资料并特别查看它生成的内部命令,我学到了很多东西。它内部有一个自己的基于堆栈的解释器,您可以通过使用解释来读取它在内部生成的 P 代码。因此,您可以看到各种构造如何转换为低级引擎(这非常简单——但这也是其稳定性和效率的秘诀)。

      【讨论】:

        【解决方案5】:

        【讨论】:

          【解决方案6】:

          我建议关注 www.sqlite.org

          它是最新的、小型的(源代码 1MB)、开源的(所以你可以自己弄清楚)...

          关于它是如何实现的书籍已经写过:

          http://www.sqlite.org/books.html

          它可以在台式电脑和手机的各种操作系统上运行,因此实验很容易,学习它在现在和将来都会很有用。

          这里甚至有一个不错的社区:https://stackoverflow.com/questions/tagged/sqlite

          【讨论】:

          • 3.10 的字节大小现在几乎是 7.0 mb 的源代码。只有少数特权人士可以一口气消化所有这些。不过,this 也是一个不错的起点。
          • 确实如此。最近花了一些时间在 SQLite 的源代码中寻找 SQLCipher 中的错误,这绝对是一场噩梦。 6 年前的生活更简单 :-)
          • 只是一个简短的问题,因为我错过了聚会,我想从第一个版本开始会更轻松(并且可能有用)?其实对于大项目的所有认真的代码阅读我都应该这样做?
          【解决方案7】:

          也许你可以向HSQLDB学习。我认为他们提供了用于学习的小而简单的数据库。开源的可以看一下代码。

          【讨论】:

            【解决方案8】:

            如果您对 MySQL 感兴趣,我也建议您使用 wiki page,它提供了一些有关 MySQL 工作原理的信息。另外,您可能想看看 Understanding MySQL Internals

            您还可以考虑为您的数据库引擎查看非 SQL 接口。请查看Apache CouchDB。它就是你所说的面向文档的数据库系统。

            祝你好运!

            【讨论】:

            • 如果您想查看另一个数据库:sqlserverinternals.com 她在 SQl 服务器内部的 nbooks 是一流的。
            【解决方案9】:

            我不确定它是否符合您的要求,但我已经使用 perl 实现了一个简单的面向文件的数据库,支持简单 (SELECT, INSERT , UPDATE)。
            我所做的是将每个表作为一个文件存储在磁盘上,并以明确定义的模式存储条目,并使用内置的 linux 工具(如 awk 和 sed)来操作数据。为了提高效率,缓存了经常访问的数据。

            【讨论】:

            • 你还有代码吗,你可以分享一个链接
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-28
            • 1970-01-01
            • 2011-05-18
            • 2010-09-17
            • 1970-01-01
            相关资源
            最近更新 更多