为什么关系数据库仅接受SQL查询?


15

据我所知,大多数关系数据库不提供任何用于查询的驱动程序级API,只有query将SQL字符串作为参数的函数除外。

我在想,如果可以做的话,会变得多么容易:

var result = mysql.select('article', {id: 3})

对于联接的表,它会稍微复杂一些,但仍然可能。例如:

var tables = mysql.join({tables: ['article', 'category'], on: 'categoryID'});
mysql.select(tables, {'article.id': 3}, ['article.title', 'article.body', 'category.categoryID'])

代码更简洁,没有字符串解析开销,没有注入问题,更易于重用查询元素...我可以看到很多优点。

为什么选择仅通过SQL提供对查询的访问有特定原因吗?


14
您的第一个示例做了什么,而ORM尚未提供?
罗伯特·哈维

4
如果任何人唯一要做的就是简单查询,那么您的方法就可以正常工作。
Blrfl 2013年

5
@RobertHarvey没事。但是需要将其转换为SQL。我的问题的重点是为什么我们不能对数据操作进行驱动程序级别的访问。
lortabac

20
对我来说,这就像在问为什么烤面包机不接受冰淇淋。
HLGEM

2
有人已经考虑过您的想法,并且将其进一步发展,因此ORM诞生了。
松饼人

Answers:


33

数据库无法正常运行-它们通常在其他服务器上运行。因此,即使您有一个API,它也需要通过网络发送一些东西来表示您的查询及其所有的投影,过滤器,组,子查询,表达式,联接,聚合函数等。这些东西可能是XML或JSON或某些专有格式,但也可能是SQL,因为它已经过尝试,测试和支持。

如今,自己构建SQL命令已经不那么普遍了-许多人使用某种ORM。即使这些最终转换为SQL语句,它们也可能提供您需要的API。


17
我不同意手动构建SQL命令。ORM非常适合非常简单的数据模型。除了琐碎的事情,您还要编写自己的SQL层。
马丁·约克

2
我将扮演魔鬼的拥护者并注意,任何合理的ORM都应可配置以满足应用程序的需求。
Bunglestink

7
@LokiAstari:的确如此,但琐碎的CRUD内容可以构成您应用程序的80%或更多。
罗伯特·哈维

@Tim,非常好。实际上,问题中提出的假设语法看起来很像JSON。
John M Gant

JSON是一种数据封装和传输格式,而不是一种语言。
克雷格(Craig)2016年

35

因为SQL提供了通用的API。您可以编写符合ANSI 92 SQL的驱动程序,该驱动程序发出SQL并公开您所需的API。作为一项特别的好处,它几乎可以与任何SQL数据库一起使用,而无需重写。

如果按照您的方式进行,每个SQL数据库将具有不同的API。当然,除非我们都对您的API进行了标准化。但是,然后,我们或多或少会再次使用SQL,不是吗?除了您的API似乎是特定于编程语言的,而SQL并非如此。


7

为了管理目的,在数据​​库上还有很多事情要做,因此能够编写脚本和提交文本以添加用户,运行备份,加载数据,更改架构等非常重要。大多数DBA都不希望在其他编程语言中执行此操作。

如果DBA希望继续使用SQL,则必须使用另一种语言,则数据库将承担处理这两种语言的负担。

数据库中有许多新功能,因此我认为它们不会停滞不前。他们只是出于某种原因没有按照您的建议去做。

SQL Server能够通过SQL CLR从内部执行.NET代码。对于某些不适合关系模型但想要保持性能的任务,这很有帮助。我知道这不是您想要的。这是数据库正在做的许多事情的一个例子。

它不会很快消失。NuoDB最新上市的数据库之一。他们保留了SQL,提供了ACID,同时增加了分发服务器并在云中运行它的功能。您可能想研究一下为什么他们要花那么多精力来促进SQL的延续(这不是唯一的原因,但这是一个巨大的卖点。)。


SQL Server中的.NET代码实际上不在数据库引擎内部运行。它是.NET代码,被编译为服务器上的程序集,并且存储过程是数据库服务器知道如何调用的属性静态类方法。这些方法使用数据提供程序,并像其他任何.NET代码一样建立与数据库的连接。对于支持Java存储过程的数据库(Oracle,Sybase),情况也类似。另一方面,SQL是数据库的“本机接口”,在大多数数据库产品中都很相似,实际上是直接在数据库中解析和执行的。
克雷格(Craig)

@Craig-非常好。
JeffO '16

3

SQL DBMS通过本地语言对存储进行了实质性的优化访问,正如您所指出的,许多访问者没有提供其他API。

关于数据库失灵的观察在许多情况下并不适用,并且实际上并没有直接关系。

即使是需要使用SQL DML的数据库,也经常会提供一个游标库来提供对结果集的迭代器访问,众所周知的Microsoft Access和Btrieve SQL DBMS都为数据库中的各个表提供了直接记录接口,作为一种机制。在特定情况下提供非常高性能的访问。

如前所述,使用这种语法的复杂查询将重现70年代后期的网络数据库行为。

由于不熟悉,备用访问机制对主流用户的吸引力较小,但是NoSQL数据库的普及程度可能会增加对其他API的兴趣,以实现特定的性能提升。似乎几乎没有其他人推荐这种方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.