SQL(语言)的替代品是什么?[关闭]


95

我偶尔会听到一些有关SQL如何烂透的东西,但这不是一种好语言,但我从未真正听到过很多有关它的替代方法的信息。那么,还有其他具有相同目的(数据库访问)的优秀语言,又有什么比SQL更好的语言呢?有没有使用这种替代语言的优秀数据库?

编辑:我熟悉SQL并一直使用它。我对此没有问题,我只是对可能存在的任何替代方案以及人们为什么更喜欢它们感兴趣。

我也不是在寻找替代类型的数据库(NoSQL运动),而是以不同的方式访问数据库。


22
SQL很烂?有参考吗?
Murali副总裁

3
您不是在说与XML相比糟透了吗?
布拉奇(Bratch)2010年

6
:无论是SQL其实很烂或不值得我很感兴趣,下面是一个例子,但。en.wikipedia.org/wiki/The_Third_Manifesto我猜“吸”可能是错误的字..
布伦丹·朗

4
需要说明的是:我对SQL没问题。我只是喜欢学习其他想法,以防万一。
布兰丹(Brendan),2010年

6
如果它必须是查询语言,并且必须是RDBMS,那么请查看Quel:en.wikipedia.org/wiki/QUEL_query_languages —这也是Postgres在1995年之前使用的,当时它也将其名称更名为愚蠢的“ PostgreSQL”。

Answers:


44

我当然同意,无论是从自动生成SQL的角度来看还是从解析SQL的角度来看,SQL的语法都难以使用,如果我们为满足需求而设计SQL,这不是我们今天要编写的语言风格。今天就可以了。我认为,如果今天设计语言的话,我们不会找到太多不同的关键字,我怀疑连接语法会有所不同,像GROUP_CONCAT这样的函数将具有更常规的语法,而不是在括号中间插入更多关键字来控制其行为...如果我们今天重新设计了该语言,则希望/期望在SQL中创建您自己希望/希望看到的不一致和冗余的洗衣清单。

对于关系数据库而言,SQL没有其他选择(即SQL作为协议),但是在应用程序中编写SQL的选择有很多。这些替代方案已以与关系数据库一起使用的前端形式实现。前端的一些示例包括:

我认为今天的基本主题是,我们不是使用一种新的查询语言来代替SQL,而是创建特定于语言的前端,以将SQL隐藏在常规的日常编程语言中,并将SQL作为与关系型对话的协议数据库。


有趣。但这是有道理的。
布兰丹(Brendan)2010年

11
没错,但理想情况下,应该有一种查询语言可以很好地与语言配合使用。SQL已简化为协议这一事实证明了它作为一种语言的弱点。

3
万岁!三年前,由于典型的公司实践,即在不做任何改动的情况下一遍又一遍地复制SQL查询片段的典型企业实践中,我正忍受着迅速增加的技术债务,因为SQL中没有封装或本地方法。我从您的帖子(现在称为Slick)中查找了ScalaQuery并重写了整个系统,每6个查询变为1,这是因为您可以封装并拥有本地方法!如果有人遭受SQL恐怖困扰,请查找Scala Slick或Quill并为启示做准备!
ChoppyTheLumberjack

18

看看这个清单。

休眠查询语言可能是最常见的。Hibernate的优点是对象非常容易(几乎自动)映射到关系数据库,并且开发人员不必花很多时间进行数据库设计。请访问Hibernate网站以获取更多信息。我相信其他人也会喜欢其他有趣的查询语言...

当然,有很多NoSQL内容,但是您特别提到对这些内容不感兴趣。


绝对是我要找的东西。
布兰丹(Brendan)2010年

该列表上有非常奇怪的语言集合。我不认为XQuery属于,而且我对D的了解还不足以知道为什么它属于。
肯·布鲁姆

1
@Ken布鲁姆显然有一个名为d的查询语言,并呼吁D.一个单独的类C语言,我认为第一个是类C语言..
布伦丹龙

我肯定对D说得太快了。当我看到这个名字时,我在想数字火星的D-我发现D数据语言完全是另一回事。
肯·布鲁姆


13

“我偶尔会听到有关SQL如何糟糕的事情,这不是一种好语言”

SQL已经有30多年的历史了。关于“哪些功能使某种东西成为一种'好的'语言,而哪些使它成为一种'不好的”语言的见解比SQL本身发展得更快。

另外,SQL不是一种符合当前“关系型所必需的”标准的语言,因此,SQL并不是要引导的关系型语言。

“但是我从来没有真正听到过很多关于它的替代品的信息。”

我邀请您考虑一下您尝试只在错误的地方(即,商业DBMS行业)收听的可能性。

“那么,还有其他具有相同目的(数据库访问)的优秀语言,又是什么使其比SQL更好呢?”

Date&Darwen在其“第三宣言”中描述了现代数据操作语言必须符合的功能,其最新版本已在其“数据库,类型和关系模型”一书中进行了介绍。

“有没有好的数据库使用这种替代语言?”

如果用“好”来表示“工业强度”,则否。最接近的东西可能是Dataphor。

Rel项目提供了在“数据库,类型和关系模型”中定义的Tutorial D语言的实现,但是Rel当前的主要目标本质上是教育性的。

我的SIRA_PRISE项目提供了“真正的关系”数据管理的实现,但是我也犹豫是否将其标记为“一种语言的实现”。

当然,您可能还会像一些人建议的那样研究一些非关系性内容,但是我个人认为非关系性数据管理是数十年来的技术衰退。那不值得考虑。

哦,顺便说一句,用于管理数据库的软件系统不是“数据库”,而是“数据库管理系统”,简称“ DBMS”。就像照片与照相机不一样,如果您正在讨论照相机,并且想避免混淆,那么应该使用正确的词“照相机”而不是“照片”。


非关系型数据库似乎有一定用处(某些应用程序从结构化程度较低的数据中可以获得更好的性能),因此我不会将其称为回归。不错的答案。
布兰丹(Brendan)2010年

2
所有的关系型人都已久久的挫败感使“表现”似乎被视为该模型的特征。这种看法是有缺陷的,时期。性能是模型实现的特征。RM的任何现有实施确实似乎经常会引起性能问题,这是多种因素的综合:(a)完全实施RM完全是极其困难的,(b)DBMS供应商没有为新的实施进度而努力,以及(c)用户对底层算法缺乏足够的了解。
Erwin Smout,2010年

3
@Erwin但是,如果我们发现特定模型固有地难以高效实施,那么可以肯定地说,从效率角度来看,该模型存在问题。
2012年

SQL太可怕了。30年前,使用类似英语的语法和单词听起来像是个好主意,像是模糊的用户友好并且总比没有好。但是如今,我们知道不是,用符号语言表达计算机概念更好。如果您想使用英语,那么最好拥有适当的自然语言解析器。SQL不会努力正确地解析自然语言,这只是一系列使用(有时是可选的)英文单词而引起的混乱,使其变得更加混乱。
罗尔夫(Rolf)

2
是的,SQL太可怕了,但是并不是您真正提到的原因。如果“象征性不够”是真正的罪魁祸首,我们都将使用APL。这种语言极具象征意义,以至于大多数人将其标记为世界上唯一的只写语言。SQL语言的符号恰好与牛津或韦伯斯特词典中出现的某些单词重合。没有任何根本原因会导致它本身成为问题。
Erwin Smout

12

也许您在想批评C. Date和他的朋友已经反对现有的关系数据库和SQL。他们说系统和语言不是100%相关的,应该是。我真的没有在这里看到任何真正的问题。据我所知,只要您掌握使用SQL的方式,就可以拥有100%的关系系统。

我个人经常遇到的问题是,SQL缺乏表达能力,而这种能力是从其理论基础(关系代数)继承而来的。一个问题是缺乏对域顺序使用的支持,使用日期,时间戳等标记的数据时会遇到这种问题。我曾经尝试在充满时间戳的数据库上完全用纯SQL编写报表应用程序,但这是不可行的。另一个是缺少对路径遍历的支持:我的大多数数据看起来像有向图,我需要遍历路径,而SQL无法做到这一点。(它缺少“传递闭包”。SQL-1999可以使用“递归子查询”来实现,但是我还没有在实际使用中看到它们。还有各种使SQL应对的技巧,但是它们很丑陋。)这些问题是顺便说一下,Date的一些著作也对此进行了讨论。

最近,我指着.QL似乎很好地解决了传递闭包问题,但我不知道它是否可以解决有序域的问题。


4
即使SQL并不是真正的关系,也存在一些即使阻止“使用SQL的方式”也阻止“ 100%关系系统”的错误。示例:SELECT Sum(foo)BAR Blah WHERE 1 = 0。SQL返回null,100%关系要求为零。carfield.com.hk/document/misc/SQL_Problems.pdf
麦凯,

1
另外,您每次选择后都写“ DISTINCT”吗?
麦凯2010年

是的,我会完全避免使用NULL(因此,对于空结果,需要使用特殊的大小写),并在各处或至少在需要使用COUNT的任何地方写DISTINCT。
reinierpost

8

直接回答:我认为那里没有任何竞争者。DBase及其模仿者(Foxpro,Codebase等)曾经是竞争者,但我认为他们基本上输掉了数据库查询语言之战。还有许多其他具有自己的查询语言的数据库产品,例如Progress和Paradox,以及我使用过的其他一些产品,它们的名字我都不记得了,而且肯定还有更多我从未听说过的名字。但我认为,没有其他竞争者能接近获得不小的市场份额。

作为数据库格式和查询语言之间存在差异的简单证明,我使用的DBase的最新版本(很多年前)提供了“传统的” DBase查询语言和SQL,两者都可以使用。访问相同的数据。

旁白:我不会说SQL很烂,但是它有很多缺陷。凭借多年积累的经验和我们的后见之明,我相信人们可以设计出一种更好的查询语言。但是,创建一种更好的查询语言并说服人们使用它是两件截然不同的事情。说服人们值得学习的麻烦会更好吗?人们已经投入了很多年的时间来学习如何有效地使用SQL。即使您的新语言更易于使用,也肯定会有学习上的弯路。以及如何将现有系统从SQL迁移到新语言?等等,当然可以做到,就像C ++,C#和Java在很大程度上推翻了COBOL和FORTRAN一样。但是要取得成功,需要结合技术优势和良好的市场营销。

尽管如此,我还是会在有人批评它时急于捍卫SQL的人中感到轻笑,他们坚持认为您对SQL的任何问题都必须是您自己对SQL的无能为力,而不是SQL的任何错误,您一定不要冷静下来,深吸一口气:我们侮辱的是计算机语言,而不是您的母亲。


1
@Jay:一种可能替代SQL的方法可能是完全没有数据库特定的语言,请使用常规的OO编程语言进行数据持久化。请参阅我关于对象数据库和ORM的答案。我不会说ORM如今没有获得一些市场份额。
kriss

Kriss:我当时认为ORM不是一种“查询语言”,而是一种位于查询语言之上的东西。我想如果这就是您用来与数据库进行通信的方式,那么它可以被认为是查询语言,也许我只是在ped脚。就像,我记得很多年前读到的那样,COBOL和C并不是真正的计算机语言,只有汇编程序才是真正的计算机语言。COBOL和C只是被翻译成计算机语言的东西。当时和现在的争论似乎很愚蠢。)所以:好的,我会买的。
杰伊

1
这个答案可能已经过时了。现在有非SQL数据库,例如Mongo等,在市场中占有不小的份额。
周杰伦


7

早在1980年代,ObjectStore就提供了透明的对象访问。除了没有所有额外的泄漏抽象层之外,它有点像RDBMS加上ORM:它直接将对象存储在数据库中。

因此,这种选择实际上是“完全没有语言”,或者也许是“您已经在使用的语言”。您将编写C ++代码并创建或遍历对象,就好像它们是本机对象一样,数据库将根据需要处理所有事情。有点像ActiveRecord,但实际上效果和ActiveRecord营销闪电战一样好。:-)

(当然,它没有甲骨文的营销能力,也没有MySQL的零成本,所以每个人都忽略了它。现在我们尝试用RDBMS和ORM复制它,有些人试图说表实际上存储对象很有意义,并且编写巨大的XML文件来告诉您的计算机如何将对象映射到表是某种合理的解决方案。)


2
至少在那些日子里,这种让查询语言成为“您已经在使用的语言”的弊端在于,数据库没有太多空间来优化访问模式。我喜欢SQL的一件事是它是声明性的,数据库尽了最大的努力来弄清楚如何最好地执行查询。如今,没有其他语言能够提供与优化有关的大量智能。我只是认为我们可以对关键字进行更多的标准化,如果今天重新编写,可以简化语法。
肯·布鲁姆

4
对点:从总体上看,查询优化器非常笨拙。看看SO上有多少个“帮助我优化查询”问题。要编写高效的查询,您必须了解查询优化器将要执行的操作。对于我的编程环境,我已经有了一个探查器-就此而言,还有一个调试器-而且它们比我见过的任何EXPLAIN都要好得多。我不知道ObjectStore在这方面有多出色,但是同类软件堆栈可能很棒

在2011年,您可以在Smalltalk中下载免费版本的Gemstone和程序。唯一需要考虑的是如何将一个类版本的实例迁移到另一个类版本(它会自动处理的简单情况)
Stephan Eggermont 2011年

6

这些天的普遍运动是NoSQL。通常,这些技术是:

我个人认为SQL只要符合您的需求就没有错。SQL具有表现力,非常适合处理结构化数据。


2
+1用于面向文档的数据库。随着数据集规模的增长,关系模型可能会变得非常缓慢……
Mike Cialowicz 2010年

2
您提到的不是SQL的替代品,甚至不是语言。诸如Apache Pig和Apache Hive之类的计划更像它。
reinierpost

5

我认为您可能对Dataphor感兴趣,它是一个开放源代码的关系开发环境,具有自己的数据库服务器(说D),并且具有从其查询语言派生用户界面的能力。

另外,看来 Ingres仍然支持QUEL,并且它是开源的。


从技术上讲,数据仓库服务器使用的语言是D4,D(或教程D ...)是一种稍有不同的语言。
麦凯2010年

D不再是一种书呆子,D并不是语言,而是Date&Darwen给出的规范。他们使用“教程D”作为示例语言。D4确实具有D资格,或者至少在大多数情况下具有D资格,但是McKay正确地认为应该说它是“ A D”,而不是说它是“ D”。Dataphor文档中有一个符合性文档。
N8allan

4

SQL在其设计的领域(相互关联的数据表)上运行良好。这通常在传统业务数据处理中找到。尝试持久存储复杂的对象网络时,SQL不能很好地工作。

如果您需要存储和处理相对传统的数据,请使用一些基于SQL的DBMS。

回应您的编辑:

如果您正在寻找SQL DML的替代方法以从关系数据存储中检索数据,那么我从来没有听说过SQL的任何替代方法。

我认为,SQL所带来的冲击与该语言相比并没有太多与该语言所基于的基础数据存储原理相反。人们经常将语言SQL与建立RDBMS的关系数据模型混淆。


1
是的,我写这之后意识到,每个人的事情,SQL和关系型数据库是相同的东西..
布伦丹龙

4

关系数据库不是唯一的数据库。我应该说一个关于对象数据库的词,因为我在其他人的回应中没有看到它。我在Zope python框架上有一些经验,该框架使用ZODB进行对象持久性而不是RDBMS(嗯,从理论上讲,可以用zope内的另一个数据库替换ZODB,但是上次我检查不成功时,它可以工作)对此并不乐观)。

ZODB的思维方式实际上是不同的,更像是对象编程,它恰好是持久的。

ORM可被视为一种语言

从某种意义上说,我相信对象数据库模型就是ORM的目的:通过通常的对象模型访问持久性数据。它是一种语言,正在获得一定的市场份额,但是目前我们不将其视为一种语言,而是一种抽象层。但是,我认为在对象数据库上使用ORM比在SQL上使用ORM效率要高得多(换句话说,我碰巧使用某些SQL数据库来吸收ORM的性能)。


3

SQL的实现方式很多(SQL Server,mysql,Oracle等),但是就设计成用于关系数据存储和检索通用语言而言,没有其他语言可以达到相同的目的

有诸如db4o之类的对象数据库,也有类似的所谓noSQL数据库,它们几乎引用了任何依赖SQL的数据存储机制,但是大多数常见的开源产品(如Cassandra)松散地基于Google的Bigtable概念。

还有许多特殊用途的数据库产品,例如CDF,但您可能不必担心这些-如果需要,您就会知道。

这些都不等同于SQL。

这并不意味着它们是“更好”或“更差”的-它们只是不一样。丹尼斯·福布斯(Dennis Forbes)最近写了一篇很棒的文章,打破了许多针对SQL的奇怪说法。他坚持(我同意),这些抱怨主要来自于人们和商店,他们最初是为该工作选择了错误的工具,或者没有正确使用他们的SQL DBMS(当我这样做时,我什至都不感到惊讶。查看另一个SQL数据库,其中每个列都是一个,varchar(50)并且在任何地方都没有一个索引或键。

如果您正在实施另一个社交网站,而又不太关心ACID原则,则一定要开始研究db4o之类的产品。但是,如果您正在开发关键任务业务系统,我强烈建议您在加入“ SQL Sucks”合唱之前三思。首先进行研究,找出各种产品可以支持和不支持的功能。


编辑-我正忙于写答案,几分钟后才收到问题更新。话虽这么说,SQL本质上与DBMS本身密不可分。如果运行SQL数据库产品,则可以使用SQL句点来访问它。

也许您正在寻找语法上的抽象;Linq to SQL,实体框架,Hibernate / NHibernate,SubSonic以及许多其他ORM工具都提供了自己的类似SQL的语法,而这些语法却不是SQL。所有这些都“编译”为SQL。如果运行SQL Server,则还可以编写CLR函数/过程/触发器,该控件允许您使用将在数据库中运行的任何.NET语言编写代码。但是,它实际上并不能替代SQL,而是对它的扩展。

我不知道您可以在SQL数据库上放置任何完整的“语言”。只需切换到其他数据库产品,最终您将在管道上看到SQL。


我认为您将关系数据库与SQL数据库混淆了。关系数据库没有必须使用SQL的特殊原因(除非其他所有人都使用它)。是的,我知道大多数数据库产品仅使用SQL。
布兰丹(Brendan)2010年

1
@Brendan龙:这是正确的,关系数据库不具有使用SQL。但是,这就是关系数据库使用的。当今存在的其他非SQL产品不是关系数据库。
亚伦诺特(Aaronaught)2010年

D和Quel呢?它们似乎不太流行,但是它们存在(它们被用于关系数据库)。
布兰丹(Brendan)2010年

1
@Brendan Long:据我所知,Quel已被SQL取代。第一次我听说D,从Wiki文章中我看到它似乎并不是一种语言本身,而是一种DB语言应具有的已定义功能集。尽管可能有一些非常模糊的实现,但我认为这不会对上面的内容有任何实质性的改变。另外,我认为您应该意识到,当人们说“ SQL Sucks”时,他们不是在指SQL语法,而是(正确或错误地)指的是基于SQL的关系数据库。
亚伦诺特,2010年

3

SQL是事实。

试图使开发人员免受其攻击的框架最终创建了自己的特定语言(想到了Hibernate HQL)。

SQL很好地解决了一个问题。学习并不比高级编程语言难。如果您已经知道一种功能语言,那么掌握SQL就是一件轻而易举的事情。

考虑到提供最先进的数据库(Oracle和SQL Server)支持SQL的领先数据库供应商,并且已经花费数年时间投资于优化引擎等,并且所有领先的数据建模软件和变更管理软件都采用SQL交易,我想说的是最安全的选择。

此外,数据库不仅仅具有查询功能。有可伸缩性,备份和恢复,数据挖掘。大厂商支持很多东西,甚至新的“缓存”引擎甚至都没有考虑。


LINQ不是一种旨在使开发人员免受SQL攻击的语言,它是一种用于查询集合的查询语法,可以扩展为支持不同的集合源。SQL数据库恰好是这些来源之一。
坎佐尔2010年

好的一点,LINQ不是有效的例子。编辑。
codenheim 2010年


1

在.NET世界中,尽管它仍然具有SQL风格的感觉,但是LINQ-to-SQL将使您能够很好地结合使用SQL和内存中的.NET处理数据。它也简化了许多真正没人想做的底层数据管道。

如果要查看完全不同的数据库类型,请查看CouchDB。“更好”显然是一个相对要求,这种非关系数据库是“更好”的,但仅在某些情况下才是。


0

SQL 语言非常强大,并且关系数据库管理系统已经并且仍然取得了巨大的成功。但是有一类应用程序需要非常高的可伸缩性和可用性,但不一定需要高度的数据一致性(最终一致性才是最重要的)。通过放宽对完全符合ACID的事务的需求,各种系统都比RDBMS获得更好的性能和扩展性。这些已被命名为“ NoSQL”,但是正如其他人指出的那样,这是一个错误的称呼:也许应该将它们称为NoACID数据库。

迈克尔·斯通布雷克(Michael Stonebraker)在“ NoSQL”讨论中与SQL无关


那么NoACID“数据库”是否可以作为数据库访问语言替代SQL?不,他们不是。
reinierpost 2010年

虽然SQL功能强大,但关系代数功能更强大。
麦凯

@reineirpost:同意。您可以使用SQL查询NoACID数据库。你可以查询文本文件,而不是关系太(一些古老的Unix命令行工具对应的操作中关系代数。
吉姆Ferrans

@McKay:是否有支持关系代数语法的商业RDBMS?那肯定很棒。
Jim Ferrans 2010年

该线程中的其他人提到了诸如Dataphor之类的内容,目的是更好地遵循关系代数。
麦凯'11
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.