【发布时间】:2010-09-07 10:29:17
【问题描述】:
尽管存在 SQL 的 ANSI 标准,为什么 SQL 发行版如此不标准? SQL 数据库的工作方式是否真的存在很多有意义的差异,或者仅仅是我一直使用的两个数据库:MS-SQL 和 PostgreSQL?为什么会出现这些差异?
【问题讨论】:
标签: sql sql-server postgresql
尽管存在 SQL 的 ANSI 标准,为什么 SQL 发行版如此不标准? SQL 数据库的工作方式是否真的存在很多有意义的差异,或者仅仅是我一直使用的两个数据库:MS-SQL 和 PostgreSQL?为什么会出现这些差异?
【问题讨论】:
标签: sql sql-server postgresql
ANSI 标准仅指定了一组有限的命令和数据类型。一旦你超越了这些,实施者就靠他们自己了。并且一些非常重要的概念根本没有指定,例如自增列。 SQLite 只选择第一个非空整数,MySQL 需要AUTO INCREMENT,PostgreSQL 使用序列等。这是一团糟,而且只有在 OSS 数据库中!尝试让 Oracle、Microsoft 和 IBM 共同决定一个棘手的功能。
【讨论】:
这是“隐形锁定”的一种形式。 Joel 在这里详细介绍:
公司最终在实施过程中将其业务功能与非标准或奇怪的不受支持的功能捆绑在一起,这限制了他们从供应商转移到竞争对手的能力。
另一方面,这是相当短视的,因为任何有一半大脑的人都会倾向于抽象出专有部分,或者完全避免锁定,如果它变得太令人震惊的话。
【讨论】:
首先,在不兼容方面,我不认为数据库与浏览器或操作系统一样。任何经过几个小时培训的人都可以开始对任何 SQL 数据库进行选择、插入、删除和更新。同时,很难编写在每个浏览器上呈现相同的 HTML,或者为多个操作系统编写系统代码。通常,SQL 的差异与性能或相当深奥的特性有关。主要的例外似乎是日期格式和函数。
其次,数据库开发人员通常有动力添加使他们的产品与其他产品区分开来的功能。 Oracle、MS SQL Server 和 MySQL 等产品是一个庞大的生态系统,在实践中很少交叉授粉。在我的工作场所,我们使用 Oracle 和 MySQL,但如果需要或需要,我们可能会在大约一天内切换到 100% Oracle。所以我非常关心 Oracle 在每个版本中为我们提供的闪亮玩具,但我什至不知道我们使用的是什么版本的 MySQL。就我们而言,IBM、微软、PostgreSQL 和其他公司可能不存在。在数据库世界中,拥有获得和留住客户和用户的功能远比兼容性重要得多。 (我想,这就是“锁定”答案的积极意义。)
第三,不同公司以不同方式实施 SQL 是有正当理由的。例如,Oracle 有一个多版本控制系统,允许非常快速和可扩展的一致读取。其他数据库缺少该功能,但通常更快地插入行和回滚事务。这是这些系统的根本区别。它不会使一个比另一个更好(至少在一般情况下),只是不同。如果数据库引擎之上的 SQL 充分利用了它的优势并试图将其弱点最小化,那么人们应该不会感到惊讶。事实上,开发者不这样做是不负责任的。
【讨论】:
CROSS APPLY这类似于 DB2 和 Postgres 中的(更接近标准)LATERAL,Oracle 中的CONNECT BY,它们在添加递归 CTE 之前做了很多年,LIMIT/TOP/FETCH FIRST 在各种 dbms 等中)。
John:该标准实际上涵盖了很多主题,包括标识列、序列、触发器、例程、upsert 等。当然,这些标准组件中的许多可能在第一次实现之后才实施;这可能是 SQL 标准合规性通常较低的原因。
Neall:实际上,SQL 标准在某些领域领先于实施。例如,拥有 CREATE ASSERTION 会很好,但据我所知,目前还没有 DBMS 实现断言。
就我个人而言,我认为某些 ISO 标准(如 SQL 标准)的封闭性是问题的一部分:当一个标准不能在线获得时,实施者/规划者不太可能知道它,而且太少客户要求合规是因为他们不知道该要求什么。
【讨论】:
正如 1800 所说,这肯定是有效的锁定。但为了对数据库供应商公平起见,SQL 标准总是在追赶当前数据库的功能集。我们今天拥有的大多数数据库都具有相当古老的血统。如果您追溯 Microsoft SQL Server 的根源,我想您会发现 Ingres——70 年代最早编写的关系数据库之一。 Postgres 最初是由一些人在 80 年代作为 Ingres 的继任者编写的。 Oracle 倒退了很久,我不确定 MySQL 是从哪里来的。
数据库的不可移植性确实很糟糕,但可能会更糟。
【讨论】: