sql - 设计 SQL 替代方案?

标签 sql lisp scheme innodb dsl

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

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

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

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

最佳答案

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

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

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

(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。您可以在搜索词中引入变量,而不必担心引用它们。

关于sql - 设计 SQL 替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/933667/

相关文章:

sql - 帮助为嵌套集编写 SQL 查询

list - Lisp,如何从列表中删除元素列表?

emacs - Emacs 中的 perltidy 模式自动运行

scheme - 有人可以解释一下下面的方案代码吗?

php - 如何从多个表中获取多个计数?

sql - 选择对不同数据库服务器上的 2 个表进行查询

java - 以下sql代码无法插入数据是什么原因?

list - Lisp 中的列表问题

functional-programming - Scheme 上是否有 "set!"的替代方案

python - 方案中的斐波那契函数