设计SQL替代方案?

use*_*955 5 lisp sql dsl scheme innodb

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

  1. 一种纯粹的关系代数语言,和
  2. 有一个优雅的Lisp-/Scheme式语法

假设有一个像MySQL这样的RDBMS,我究竟需要开始我的语言设计工作吗?在InnoDB等存储引擎层之上?

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

Die*_*Epp 9

如果你真的在lisp中写它,它不应该花多长时间.我在大约一个下午在Lisp写了一个简单的数据库引擎.以下是它的外观示例:

(select movies (<= 1990 year 2000) (member director '(terry-gilliam tim-burton)))
Run Code Online (Sandbox Code Playgroud)

在这里,'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))
Run Code Online (Sandbox Code Playgroud)

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

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


Vin*_*vic 5

我怀疑解决这个问题的最好方法是在你的语言和SQL之间创建一个翻译器,主要是因为你不能从rdbms获得比通过SQL方言提供的功能更多的功能.

MySQL的存在与存储引擎所做工作的难度无关,MySQL中的存储引擎确实做了大部分的工作,让MySQL解析并优化SQL并从引擎中检索数据,尊重相应的语义.引擎.

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

此外,您可能无法在现有数据库技术上生成纯关系语言,请查看"第三个宣言"以获取更多信息.

所有这一切,我真的会先看看所有现有的SQL包装器,也许有些会适合你的口味.