我正在考虑设计&实现我自己的SQL等价物(DDL + DML)......
假设有一个像MySQL这样的RDBMS,我需要在哪里开始我的语言设计工作?在存储引擎层之上,如InnoDB?
我不知道所有RDBMS功能通常都位于存储引擎的顶部?我目前直观的理解是,创建RDBMS(例如MySQL)所需的大部分工作已经在存储引擎(特别是InnoDB)中完成,而您需要做的就是创建一个包装语言它。但我也知道如果真的如此,为什么MySQL首先存在!
答案 0 :(得分: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。您可以在搜索词中引入变量,而不必担心引用它们。
答案 1 :(得分:5)
我怀疑解决这个问题的最佳方法是在你的语言和SQL之间创建一个翻译器,主要是因为你无法从rdbms获得比通过SQL方言提供的功能更多的功能。
MySQL存在与存储引擎所做工作的难度无关,storage engines in MySQL确实做了大部分繁琐的工作,让MySQL解析并优化SQL并从引擎中检索数据,尊重引擎的相应语义。
大多数rdbms都没有向用户/管理员公开存储引擎,所以在这方面MySQL有点独特,这使得创建翻译更合理,这样你就可以(通过改变一些语法规则)来使用更多通过你的应用程序获得一个rdbms。
此外,您可能无法在现有数据库技术上生成纯关系语言,请查看The Third Manifesto以获取更多信息。
所有这一切,我真的会先看看所有现有的SQL包装器,也许是some will suit your taste。
答案 2 :(得分:1)
传统上,许多rdbms产品都是基于isam软件包构建的 - mysql就是一个明显的例子。它们都在指定表和索引,迭代行等的级别上运行。具有处理读,写,锁等的基本工具。
此外,由于竞争原因,大多数isam产品都需要在顶层添加SQL层。您可以开始搜索那些SQL层可能可用的示例。
答案 3 :(得分:1)
在 Practical Common Lisp 中,this chapter的目标是一个简单的RDBS风格的音乐数据库接口。可能有帮助。