SQL差异的原因

时间:2020-03-05 18:45:49  来源:igfitidea点击:

尽管存在SQL的ANSI标准,但为什么SQL发行版是如此非标准? SQL数据库的工作方式确实存在很多有意义的区别,还是我一直在使用的两个数据库:MS-SQL和PostgreSQL?为什么会出现这些差异?

解决方案

回答

ANSI标准仅指定了一组有限的命令和数据类型。一旦我们超越了这些范围,实现者便会自己依靠。根本没有指定一些非常重要的概念,例如自动递增列。 SQLite只是选择第一个非空整数,MySQL需要AUTO INCREMENT,PostgreSQL使用序列等。这很混乱,而且仅在OSS数据库中!尝试让Oracle,Microsoft和IBM共同决定一些棘手的功能。

回答

这是"隐身锁定"的一种形式。乔尔在这里详细介绍:

  • http://www.joelonsoftware.com/articles/fog0000000056.html
  • http://www.joelonsoftware.com/articles/fog0000000052.html

公司最终将其业务功能与实施中的非标准功能或者奇怪的不受支持的功能绑定在一起,这限制了其从供应商转移到竞争对手的能力。

另一方面,这是很短视的,因为任何半脑子的人都倾向于将专有部分抽象化,或者如果过于严格,则完全避免锁定。

回答

正如1800所述,这肯定是有效的锁定方式。但是为了公平起见,对于数据库供应商而言,SQL标准始终在追赶当前数据库的功能集。我们今天拥有的大多数数据库都是相当古老的血统。如果我们追溯Microsoft SQL Server的根源,我想我们会发现Ingres是70年代编写的最早的关系数据库之一。 Postgres最初由80年代的某些人撰写,作为Ingres的继承者。 Oracle可以追溯到很久以前,而且我不确定MySQL出现在哪里。

数据库的不可移植性确实很糟糕,但是可能会更糟。

回答

John:该标准实际上涵盖了许多主题,包括标识列,序列,触发器,例程,更新等。但是,当然,这些标准组件中的许多组件可能是在第一个实现之后才引入的;这可能是为什么SQL标准合规性通常较低的原因。

Neall:实际上,在某些方面SQL标准领先于实现。例如,最好具有CREATE ASSERTION,但是据我所知,还没有DBMS实现断言。

我个人认为,某些ISO标准(例如SQL标准)的封闭性质是问题的一部分:当无法在线上获得标准时,实施者/计划者就不太可能知道它,并且很少有客户要求合规,因为他们不知道要求什么。

回答

首先,就不兼容而言,我找不到像浏览器或者操作系统那样的数据库。经过数小时培训的任何人都可以开始在任何SQL数据库上进行选择,插入,删除和更新。同时,很难编写在每个浏览器上都呈现相同效果的HTML或者为多个操作系统编写系统代码。通常,SQL中的差异与性能或者相当深奥的功能有关。主要的例外似乎是日期格式和函数。

其次,数据库开发人员通常有动机去添加使他们的产品与众不同的功能。像Oracle,MS SQL Server和MySQL这样的产品是广阔的生态系统,实际上很少交叉授粉。在我的工作场所,我们使用Oracle和MySQL,但如果需要,可以在大约一天内切换到100%Oracle。因此,我非常关心Oracle在每个发行版中为我们提供的闪亮玩具,但我什至不知道我们使用的是哪个MySQL版本。就我们而言,IBM,Microsoft,PostgreSQL和其他公司可能也不存在。具有吸引和留住客户和用户的功能远比数据库世界中的兼容性重要。 (我认为,这是对"锁定"答案的积极回应。)

第三,有合理的理由使不同的公司以不同的方式实现SQL。例如,Oracle有一个多版本系统,该系统允许非常快速和可扩展的一致读取。其他数据库缺少该功能,但通常可以更快地插入行并回滚事务。这是这些系统中的根本区别。它并没有使另一个更好(至少在一般情况下如此),只是有所不同。如果数据库引擎的SQL ontop充分利用了自己的优势并试图将其弱点最小化,那么我们应该不会感到惊讶。实际上,开发者不这样做是不负责任的。