什么是SQL(语言)的好替代品?
我偶尔会听到有关SQL如何糟糕的事情,这不是一种好语言,但我从来没有听说过很多关于它的替代品。 那么,是否有其他好的语言可以达到同样的目的(数据库访问)呢,还有什么比SQL更好呢? 有没有好的数据库使用这种替代语言?
编辑:我熟悉SQL,并一直使用它。 我没有问题,只是对可能存在的替代品感兴趣,为什么人们更喜欢它们。
我也没有寻找其他types的数据库(NoSQL的运动),只是访问数据库的不同方式。
我当然同意,从自动生成语法的angular度以及从parsing的angular度来看,SQL的语法是很难处理的,而且如果我们正在deviseSQL来满足我们的要求,那么现在就不会写今天的语言风格在今天。 如果我们今天devise语言,我不认为我们会find这么多不同的关键字,我怀疑连接语法会有所不同,像GROUP_CONCAT
这样的函数将会有更多的常规语法,而不是在括号中间加上更多的关键字来控制它行为……在SQL中创build自己的不一致和冗余的清单,如果我们今天重新devise语言,您希望/希望看到平滑。
对于与关系数据库交谈(即SQL作为协议),没有任何SQL的替代方法,但是在应用程序中编写SQL有很多select。 这些替代scheme已经以与关系数据库一起工作的前端的forms实施。 前端的一些例子包括:
- SchemeQL和CLSQL ,可能是最灵活的,因为它们的Lisp遗产,但是它们看起来更像SQL,而不是其他前端。
- LINQ(在.Net中)
- ScalaQL和ScalaQuery (在Scala中)
- SqlStatement , ActiveRecord和许多其他的Ruby,
- HaskellDB
- …这个名单继续其他许多语言。
我认为现在的基本主题是,我们不是用一种新的查询语言replaceSQL,而是创build特定于语言的前端,以便在我们的常规编程语言中隐藏SQL,并将SQL视为与关系型对话的协议数据库。
看看这个列表。
Hibernate查询语言可能是最常见的。 Hibernate的优点是对象很容易(几乎自动)映射到关系数据库,开发人员不必花太多时间进行数据库devise。 查看Hibernate网站获取更多信息。 我相信别人会用其他有趣的查询语言
当然,还有很多NoSQL的东西,但是你特别提到你对这些东西不感兴趣。
也许你正在考虑批评C.date和他的朋友已经对现有的关系数据库和SQL发表意见了; 他们说系统和语言不是100%关系的,应该是。 在这里我真的没有看到任何真正的问题。 就我所见,如果你愿意的话,你可以有一个100%的关系系统,只要通过训练你使用SQL的方式。
我个人经常遇到的问题是,SQL从其理论基础 – 关系代数中遗留下来的expression能力的缺乏。 一个问题是缺乏对使用域sorting的支持,当您使用date,时间戳等等标记数据时,会遇到这种情况。 我曾经试图在一个充满时间戳的数据库上完全使用普通的SQL来完成一个报告应用程序,这是不可行的。 另一个缺乏对path遍历的支持:我的大部分数据看起来像是需要遍历path的有向图,SQL无法执行。 (它缺乏“传递闭包”,SQL-1999可以用“recursion子查询”来实现,但是我还没有看到它们在实际使用中,还有各种各样的骇客来使SQL应付,但它们很丑陋。顺便也有一些Date的着作讨论过。
最近我被指出.QL似乎很好地解决了传递闭包问题,但我不知道它是否可以解决有序域的问题。
“我偶尔会听到关于SQL如何糟糕的事情,这不是一个好语言”
SQL已经有三十多年的历史了。 对于“哪些特性使某种”好“语言以及哪些特性使其成为”坏“语言的见解,已经比SQL本身发展得更快了。
而且,SQL不是一种符合“什么是关系型”标准的语言,因此,SQL只是一种不关联的语言。
“但是我从来没有听过太多有关替代品的信息。”
我请你思考一下你试图只在错误的地方(也就是商业数据库pipe理系统行业)听到的可能性。
那么,是否有其他好的语言可以达到同样的目的(数据库访问)呢,还有什么比SQL更好的呢?“
Date和Darwen描述了现代数据操纵语言必须符合他们的“第三个宣言”的特征,其最新版本是在他们的书“数据库,types和关系模型”中提出的。
“有没有好的数据库使用这种替代语言?”
如果说“好”,你的意思是“工业强度”,那么没有。 最接近的可能是Dataphor。
Rel项目提供了在“数据库,types和关系模型”中定义的Tutorial D语言的实现,但Rel的当前主要目标是教育性的。
我的SIRA_PRISE项目提供了一个“真正的关系型”数据pipe理的实现,但是我也毫不犹豫地将其标记为“一种语言的实现”。
当然,也可以像有些人提出的那样,研究一些非关系型的东西,但是我个人认为非关系型数据pipe理是数十年的技术回归。 不值得考虑,那是。
哦,顺便说一下,用于pipe理数据库的软件系统不是“数据库”,而是“数据库pipe理系统”,简称“DBMS”。 就像照片与照相机不一样,如果你正在讨论照相机,并且你想避免混淆,那么你应该使用恰当的单词“照相机”而不是“照片”。
看看LINQ to SQL …
试了几个月前,从来没有回头….
直接回答:我不认为那里有什么严肃的竞争者。 DBase及其模仿者(Foxpro,Codebase等)曾经是一个竞争者,但我认为他们基本上已经失去了数据库查询语言之战。 还有很多其他的数据库产品有自己的查询语言,比如Progress和Paradox,还有其他一些我不知道的名字,当然还有更多的我从来没有听说过。 但我不认为其他竞争者甚至差不多在市场上占有不小的份额。
作为数据库格式和查询语言之间存在差异的简单certificate,多年前我使用的最后一个版本的DBase提供了“传统”DBase查询语言和SQL,两者都可以使用访问相同的数据。
边漫步:我不会说SQL糟糕,但它有很多缺陷。 凭借我们现在拥有的多年经验和后见之明,我相信可以devise出更好的查询语言。 但创build一个更好的查询语言,并说服人们使用它,是两个完全不同的东西。 说服人们是否值得学习的麻烦是否足够好呢? 人们已经投入了很多年的时间学习如何有效地使用SQL。 即使你的新语言比较容易使用,也肯定会有学习曲线。 你将如何将现有的系统从SQL迁移到新的语言? 等等,当然,就像C ++,C#和Java在很大程度上推翻了COBOL和FORTRAN一样。 但是需要结合技术优势和良好的营销手段才能实现。
尽pipe如此,我还是嗤之以鼻,当有人批评SQL的时候,他们坚持认为SQL的任何问题都是你自己的使用上的不足,而不是任何SQL的错误。达到理解其完美所必需的更高层次的平面。冷静下来,深吸一口气:我们侮辱计算机语言,而不是你的母亲。
现在的总体运动是NoSQL; 一般这些技术是:
- 分布式的“散列表”将数据存储为键/值对
- 面向文档的数据库
我个人认为,只要符合您的需求,SQL没有任何问题。 SQL对于处理结构化数据具有很强的expression力。
早在20世纪80年代, ObjectStore提供了透明的对象访问。 这有点像一个RDBMS加一个ORM,除了没有所有额外的漏洞抽象层:它直接存储在数据库中的对象。
所以这个select真的是“根本不用语言”,或者“你已经使用的语言”。 你可以编写C ++代码,创build或遍历对象,就好像它们是本地对象一样,数据库负责处理所有需要的东西。 有点像ActiveRecord,但它实际上和ActiveRecord营销突击索赔一样。 🙂
(当然,它没有Oracle的市场营销能力,也没有MySQL的零成本,所以每个人都忽略它。现在我们试图用RDBMS和ORM来复制它,有些人试图争辩说,表对于存储对象是有意义的,而且编写巨大的XML文件来告诉你的计算机如何映射对象到表格是一个合理的解决scheme。)
有很多SQL(SQL Server,MySQL,Oracle等)的实现,但是没有其他语言可以用作为关系数据存储和检索devise的通用语言 。
有对象数据库,比如db4o ,还有类似的所谓的noSQL数据库,这些数据库几乎所有的数据存储机制都不依赖于SQL,但是最常见的开放源代码产品,如Cassandra基于Google的Bigtable概念。
还有一些像CDF这样的专用数据库产品,但是你可能不需要担心这些 – 如果你需要的话,你会知道的。
这些都不等同于SQL。
这并不意味着他们是“更好”或“更糟糕” – 他们是不一样的。 丹尼斯·福布斯(Dennis Forbes)最近写了一篇很棒的文章,打破了一些与SQL相关的奇怪声明。 他坚持(我同意),这些抱怨主要来自那些首先select了错误工具的人或商店,或者没有正确使用他们的SQL DBMS(当我看到另一个SQL数据库,其中每一列都是一个varchar(50)
并且在任何地方都没有一个索引或键)。
如果您正在实施另一个社交网站,并不太关心ACID原则,那么通过所有的方式开始寻找诸如db4o之类的产品。 但是,如果您正在开发关键任务业务系统,那么我强烈build议您在join“SQL糟糕”合唱之前考虑一下。 先研究一下,找出各种产品可以和不能支持的function。
编辑 – 我正在写我的答案,并没有得到几分钟的问题更新。 话虽如此,SQL实质上与DBMS本身是分不开的。 如果您运行SQL数据库产品,则可以使用SQL访问它。
也许你正在寻找抽象的语法; Linq到SQL,entity framework,Hibernate / NHibernate,SubSonic和其他一些ORM工具都提供了自己的类似于SQL的语法,而不是SQL。 所有这些“编译”到SQL。 如果您运行SQL Server,那么您也可以编写CLR函数/过程/触发器,它允许您使用将在数据库中运行的任何.NET语言编写代码; 但是,这不是SQL的替代品,更多的是对它的扩展。
我不知道任何完整的“语言”,你可以在SQL数据库的顶部, 切换到不同的数据库产品,你最终会看到pipe道上的SQL。
对于它所devise的域,SQL工作正常 – 相关的数据表。 这通常在传统的业务数据处理中find。 SQL在尝试保持复杂的对象networking时不能很好地工作。
如果您的需要是存储和处理相对传统的数据,请使用一些基于SQL的DBMS。
为了回应你的编辑:
如果您正在寻找SQL DML的替代品来从关系数据存储库中检索数据,我从来没有听说过任何SQL的严重替代scheme。
SQL的敲门声并不是,我认为,与语言所基于的底层数据存储原则相对立的是,语言不是这样。 人们经常将语言SQL与构buildRDBMS的关系数据模型相混淆。
我想你可能会对Dataphor感兴趣 ,它是一个开源的关系型开发环境,拥有自己的数据库服务器(可以说D),并且可以从查询语言中派生用户界面。
另外,看起来Ingres仍然支持QUEL,而且它是开源的。
SQL是事实上的。
试图屏蔽开发者的框架最终创build了他们自己的特定语言(想到Hibernate HQL)。
SQL很好地解决了一个问题。 学习高级编程语言并不难。 如果你已经知道一个函数式语言,那么掌握SQL是一件轻而易举的事情。
考虑到领先的数据库供应商提供最先进的数据库(甲骨文和SQL Server)支持SQL,并已投入数年优化引擎等,所有领先的数据build模软件和变更pipe理软件交易在SQL中,我会说这是最安全的赌注。
而且,数据库不仅仅是查询。 有可扩展性,备份和恢复,数据挖掘。 大厂商支持很多甚至新的“caching”引擎甚至不考虑的事情。
关系数据库并不是唯一一种数据库。 我应该说一下关于对象数据库的内容,因为我在其他人的回复中没有看到它。 我有一些使用ZODB的对象持久性而不是RDBMS的Zope Python框架的经验(理论上可以用Zope中的另一个数据库来replaceZODB,但是最后一次检查我没有成功地运行,所以可以对此没有正面的评价)。
ZODB的思维方式是非常不同的,更像是对象编程,而且会持续下去。
ORM可以被看作是一种语言
在某种程度上,我相信对象数据库模型是ORM的内容:通过通常的对象模型来访问持久数据。 这是一种语言,它获得了一些市场份额,但是现在我们不把它看作是一种语言,而是作为一个抽象层。 但是我相信在对象数据库上使用ORM会比在SQL上使用更有效(换句话说,我碰巧使用一些SQL数据库作为基础层的ORM的性能)。
SQL的问题激发了我在波特兰模式存储 库维基上制作了一个名为SMEQL的查询语言草案。 评论欢迎。 它借鉴了函数式编程和IBM实验性业务系统12语言的思想。 (我最初称它为TQL,但后来发现这个名字被采用了。)
在.NET世界中,虽然它仍然具有SQL-esque的感觉,但LINQ-to-SQL将允许您将SQL和内存中的.NET数据处理组合在一起。 它也简化了很多没有人真正想做的低级数据pipe理工作。
如果你想看到一个完全不同的思维模式的数据库types,看看CouchDB 。 “更好”显然是一个相对的要求,这种非关系数据库是“更好”,但只在某些情况下。
SQL 语言function非常强大,而关系数据库pipe理系统一直都是非常成功的。 但有一类应用程序需要非常高的可伸缩性和可用性,但不一定需要高度的数据一致性(最终的一致性才是最重要的)。 通过放宽对完全ACID兼容事务的需求,各种系统比RDBMS获得更好的性能和扩展性。 这些被命名为“NoSQL”,但是正如其他人指出的那样,这是一个误导:也许他们应该被称为NoACID数据库。
Michael Stonebraker在“NoSQL”中讨论了与SQL无关的问题 。