设计SQL的替代方案?

5

我正在考虑设计和实现自己的SQL等效语言(DDL+DML),它应该是:

  1. 一种纯关系代数语言,并且
  2. 具有优雅的Lisp-/Scheme-类语法。

假设使用MySQL这样的RDBMS,我需要从哪里开始进行语言设计工作呢?在存储引擎层之上,例如InnoDB?

我不知道所有RDBMS功能通常都位于存储引擎之上吗?我的当前直觉理解是,创建RDBMS(如MySQL)所需的大部分工作已经在存储引擎(特别是InnoDB)中完成,你只需要创建一个包装器语言即可。但我也知道,如果那真的是正确的,为什么MySQL会首先存在呢!


MySQL和存储引擎生态系统是这样的:存储引擎是位于本地存储文件系统之上的层。更高层由SQL查询解析器、优化器、查询缓存等组成。MySQL可插拔的存储引擎架构被设计成存储引擎是本地存储设备和更高层(如MySQL客户端)之间的分离层。 - user59634
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中做到这一点,现在可以吗?)。 因此,即使数据库代码本身(“select”和表定义的代码)只有几行,它也很快。 数据库完全驻留在内存中,但这并不重要...您甚至可以更改宏以适应外部数据库,甚至编写它来使用索引。 对于我所处理的项目而言,它已经足够好了,因此我没有添加索引或任何花哨的内容。
我最喜欢的部分是,尽管保持SQL的简洁性,但代码与其周围的代码没有任何区别,因为它们都是Lisp。 您可以将变量引入到搜索术语中,而无需担心对它们进行引号处理。

5
我认为最好的方法是创建一个翻译器来将您的语言与SQL进行转换,主要是因为您无法从rdbms中获得比其SQL语言方言提供的更多功能。MySQL的存在与存储引擎所做的工作的难度无关,MySQL中的存储引擎真正完成了大部分的繁重工作,让MySQL解析和优化SQL,并从引擎中检索数据,尊重引擎的相应语义。大多数rdbms不向用户/管理员公开存储引擎,因此在这方面,MySQL有些独特,这使得创建一个翻译器更为合理,这样您就可以通过应用程序使用多个rdbms(通过更改一些语法规则)。另外,您可能无法在现有数据库技术上生成纯关系语言,请查看The Third Manifesto以获取更多信息。

话虽如此,我建议您首先查看所有现有的SQL包装器,也许有些会符合您的口味


1
许多关系型数据库管理系统产品传统上都是建立在ISAM套件上的 - MySQL就是一个明显的例子。它们都在指定表格和索引、迭代行等级别上运行;同时提供基本的读取、写入、锁定等功能。
此外,大部分ISAM产品出于竞争原因需要在顶层添加SQL层。您可以开始通过谷歌搜索来了解SQL层可能可用的示例。

1
在《实用通用Lisp》中,本章旨在提供一个简单的RDBS风格接口来访问音乐数据库。可能会有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接