5

我正在考虑设计和实现我自己的 SQL 等效 (DDL+DML),即...

  1. 纯关系代数语言,以及
  2. 具有优雅的类似于 Lisp-/Scheme 的语法

假设一个 RDBMS,如 MySQL,我究竟需要从哪里开始我的语言设计工作?在 InnoDB 等存储引擎层之上?

我不知道所有 RDBMS 功能通常位于存储引擎之上吗?我目前直观的理解是,创建 RDBMS(例如 MySQL)所需的大部分工作已经在存储引擎中完成(特别是在 InnoDB 中),您需要做的就是创建一个包装语言它。但我也知道,如果这是真的,为什么 MySQL 会存在!

4

4 回答 4

9

如果你真的用 lisp 编写它应该不会花很长时间。大约一个下午,我用 Lisp 写了一个简单的数据库引擎。这是它的外观示例:

(select movies (<= 1990 year 2000) (member director '(terry-gilliam tim-burton)))

这里,'select' 是一个宏。它扫描其后面的谓词以查找作为字段名称的符号,并将它们绑定到数据库中的字段。然后它编写一个函数,将这些字段绑定到传递给函数的记录值,并使用该函数过滤表。宏扩展为如下内容:

(flet ((filter (item)
        (let ((year (movie-year item))
              (director (movie-director item)))
         (and (<= 1990 year 2000)
              (member director '(terry-gilliam tim-burton))))))
 (loop for item in movies
       if (filter item) collect item))

以这种方式(实际上是在 Lisp 中,而不仅仅是使用类似 Lisp 的语法)这样做很酷的事情是您可以免费获得编译。在我的系统上,上面的代码不是由数据库引擎解释的,它实际上是程序的编译部分(在 C 中不能这样做,现在可以吗?)。因此它很快,即使数据库代码本身(“选择”和表定义的代码)只有几行长。该数据库完全驻留在内存中,但这没关系......您可以更改宏以适应外部数据库,甚至编写它确实使用索引。这对于我正在从事的项目来说已经足够好了,所以我没有添加索引或任何花哨的东西。

我最喜欢它的部分是,虽然它保留了 SQL 的所有简洁性,但代码与它周围的代码没有什么不同,因为它都是 Lisp。您可以在搜索词中引入变量,而不必担心引用它们。

于 2009-06-01T07:21:53.907 回答
5

我怀疑解决此问题的最佳方法是在您的语言和 SQL 之间创建一个转换器,主要是因为您无法从 rdbms 获得比通过其 SQL 方言提供的功能更多的功能。

MySQL 的存在与存储引擎的工作难度无关,MySQL 中的存储引擎真正完成了大部分繁重的工作,让 MySQL 解析和优化 SQL 并从引擎中检索数据,尊重相应的语义引擎。

大多数 rdbms 不会向用户/管理员公开存储引擎,因此在这方面 MySQL 有点独特,这使得创建翻译器更加合理,这样您就可以(通过更改一些语法规则)使用多个 rdbms通过您的应用程序。

此外,您可能无法在现有数据库技术上生成纯关系语言,请查看The Third Manifesto了解更多信息。

说了这么多,我真的会先看看所有现有的 SQL 包装器,也许有些会适合你的口味

于 2009-06-01T05:54:32.803 回答
1

许多 rdbms 产品传统上都是基于 isam 包构建的——mysql 就是一个明显的例子。它们都在指定表和索引、迭代行等级别上操作;具有处理读、写、锁等的基本设施。

此外,出于竞争原因,大多数 isam 产品都需要在顶部添加 SQL 层。您可以开始搜索那些 SQL 层可能可用的示例。

于 2009-06-01T06:37:22.590 回答
1

Practical Common Lisp中,本章旨在为音乐数据库提供一个简单的 RDBS 样式接口。可能有帮助。

于 2009-06-01T11:25:06.037 回答