我偶尔会听到有关SQL如何糟糕而且它不是一种好语言的事情,但我从来没有真正听到过关于它的替代方案。那么,是否有其他优秀的语言可以实现相同的目的(数据库访问),是什么让它们比SQL更好?有没有使用这种替代语言的好数据库?
编辑: 我熟悉SQL并且一直使用它。我没有问题,我只对可能存在的任何替代方案感兴趣,以及为什么人们更喜欢它们。
我也不是在寻找其他类型的数据库(NoSQL运动),只是寻找不同的数据库访问方式。
答案 0 :(得分:40)
我当然同意SQL的语法难以使用,无论是从自动生成它的角度,还是从解析它的角度来看,如果我们为SQL设计SQL,它不是我们今天要编写的语言风格。我们今天要求它。如果我们今天设计语言,我认为我们不会发现这么多不同的关键字,我怀疑连接语法会有所不同,像GROUP_CONCAT
这样的函数会有更多的常规语法,而不是在中间添加更多关键字。用于控制其行为的括号...如果我们今天重新设计了该语言,请创建自己的SQL中不一致和冗余的清单,您希望/希望看到这些不一致和冗余。
对于与关系数据库(即SQL作为协议)说话,没有任何SQL替代方法,但在应用程序中编写SQL有很多替代方法。这些替代方案已经以前端的形式实现,用于处理关系数据库。前端的一些示例包括:
我认为今天的基本主题是,不是用一种新的查询语言替换SQL,而是创建特定于语言的前端,以便在我们常规的日常编程语言中隐藏SQL,并将SQL视为 protocol 用于与关系数据库通信。
答案 1 :(得分:16)
Hibernate Query Language可能是最常见的。 Hibernate的优点是对象非常容易(几乎自动地)映射到关系数据库,开发人员不必花费太多时间来进行数据库设计。有关详细信息,请查看Hibernate website。我相信其他人会使用其他有趣的查询语言...
当然,那里有很多NoSQL的东西,但你特别提到你对那些不感兴趣。
答案 2 :(得分:13)
“我偶尔会听到有关SQL如何糟糕而且它不是一种好语言的事情”
SQL已有三十多年的历史了。关于“哪些特征使某些东西成为'好'语言以及哪些特征使其成为'坏'语言”的见解比SQL本身发展得更快。
此外,SQL不是一种符合当前“关系需要什么”标准的语言,因此,SQL不是一种关系语言来启动。
“但我从来没有真正听说过它的替代品。”
我邀请您思考一下您是否只想在错误的地方听到(也就是商业DBMS行业)的可能性。
“那么,其他优秀的语言是否具有相同的目的(数据库访问)以及是什么使它们比SQL更好?”
Date& Darwen描述了现代数据处理语言在其“第三宣言”中必须遵循的特征,其最新版本在其“数据库,类型和关系模型”一书中有所阐述。
“有没有使用这种替代语言的好数据库?”
如果“好”,你的意思是“工业强度”,那么没有。最接近的可能是Dataphor。
Rel项目提供了“数据库,类型和关系模型”中定义的Tutorial D语言的实现,但Rel的当前主要目标是教育性质。
我的SIRA_PRISE项目提供了“真正关系型”数据管理的实现,但我也不愿将其标记为“语言的实现”。
当然,你也可能会像一些人提出的那样研究一些非关系型的东西,但我个人认为非关系型数据管理是数十年的技术回归。不值得考虑,就是这样。
哦,顺便说一下,用于管理数据库的软件系统不是“数据库”,而是“数据库管理系统”,简称“DBMS”。就像照片与相机不一样,如果你正在讨论相机,而你想避免混淆,那么你应该使用正确的单词“相机”而不是“照片”。
答案 3 :(得分:12)
也许你正在考虑批评C. Date和他的朋友们已经反对现有的关系数据库和SQL;他们说系统和语言不是100%关系,应该是。我真的没有看到任何真正的问题;据我所知,只要你训练使用SQL的方式,就可以拥有一个100%的关系系统。
我个人经常遇到的是缺乏表达能力SQL继承自其理论基础,关系代数。一个问题是缺乏对使用域排序的支持,当您处理由日期,时间戳等标记的数据时,您会遇到这种情况。我曾经试图在一个充满时间戳的数据库上完全用普通的SQL做一个报告应用程序,但这是不可行的。另一个原因是缺乏对路径遍历的支持:我的大部分数据看起来都像是需要遍历路径的有向图,而SQL无法做到这一点。 (它缺少“传递性闭包”.SQL-1999可以用“递归子查询”来实现它,但我还没有在实际使用中看到它们。还有各种黑客可以使SQL应对但是它们很难看。)这些问题是顺便提一下,还有一些Date的着作讨论过。
最近我被指出.QL似乎很好地解决了传递闭包问题,但我不知道它是否可以解决有序域的问题。
答案 4 :(得分:9)
看看LINQ to SQL ...
几个月前试过了,从不回头......
答案 5 :(得分:7)
直接回答:我认为那里没有任何严重的竞争者。 DBase及其模仿者(Foxpro,Codebase等)暂时是一个竞争者,但我认为他们基本上失去了数据库查询语言的战争。还有许多其他数据库产品都有自己的查询语言,比如Progress和Paradox以及其他几个我用过的名字我不记得了,还有更多我从未听说过的名字。但我认为任何其他竞争者都不会接近获得市场上不可挽回的份额。
作为数据库格式和查询语言之间存在差异的简单证据,我使用的DBase的最后一个版本 - 多年前现在 - 提供了“传统的”DBase查询语言和SQL,两者都是可用于访问相同的数据。
Side ramble:我不会说SQL糟透了,但它有很多缺陷。凭借我们现在拥有的多年经验和后见之明,我相信我可以设计出更好的查询语言。但是创建一种更好的查询语言并说服人们使用它是两回事。是否足以说服人们认为值得学习的麻烦。人们花了很多年的时间学习如何有效地使用SQL。即使您的新语言更易于使用,也肯定会有学习曲线。您将如何将现有系统从SQL迁移到新语言?等等。当然,就像C ++,C#和Java一样,它已经在很大程度上推翻了COBOL和FORTRAN。但它需要结合技术优势和良好的营销才能实现这一目标。
尽管如此,我还是嘲笑那些在任何人批评它的时候都会急于防守SQL的人,他们坚持认为你对SQL的任何问题必须是你自己使用它的无能而不是SQL的任何错误,你必须只是没有达到理解其完美所必需的更高层面等等。冷静下来,深吸一口气:我们侮辱计算机语言,而不是你的母亲。
答案 6 :(得分:6)
这些天的一般运动是NoSQL;通常这些技术是:
就我个人而言,只要符合您的需求,我认为SQL没有任何问题。 SQL具有表现力,非常适合处理结构化数据。
答案 7 :(得分:6)
早在20世纪80年代,ObjectStore提供了透明的对象访问。它有点像RDBMS加上一个ORM,除了没有所有那些额外的漏洞抽象层:它直接将对象存储在数据库中。
所以这个替代方案真的“根本就没有语言”,或者说“你已经在使用的语言”。您可以编写C ++代码并创建或遍历对象,就像它们是本机对象一样,数据库会根据需要处理所有内容。有点像ActiveRecord,但它实际上和ActiveRecord营销blitzes声称一样好。 : - )
(当然,它没有甲骨文的营销力量,它没有MySQL的零成本,所以每个人都忽略它。现在我们尝试用RDBMS和ORM复制它,有些人试图争论这些表实际上对于存储对象是有意义的,并且编写巨型XML文件来告诉计算机如何将对象映射到表是某种合理的解决方案。)
答案 8 :(得分:5)
答案 9 :(得分:4)
SQL适用于设计它的域 - 相互关联的数据表。这通常在传统的业务数据处理中找到。在尝试持久化复杂的对象网络时,SQL无法正常工作。
如果您需要存储和处理相对传统的数据,请使用一些基于SQL的DBMS。
回复您的修改:
如果您正在寻找SQL DML的替代方案来从关系数据存储中检索数据,我从来没有听说过任何严肃的SQL替代方案。
我认为,与语言所依据的基础数据存储原则相比,SQL语言不是很反对语言。人们常常将语言SQL与构建RDBMS的关系数据模型混淆。
答案 10 :(得分:4)
SQL有许多实现(SQL Server,mysql,Oracle等),但是没有其他语言可以提供相同的目的是通用语言,专为关系数据存储和检索而设计。
有object databases,例如db4o,并且有类似的所谓noSQL数据库,它们指的是不依赖SQL,但最常见的开源产品如Cassandra基于Google的Bigtable概念。
还有一些像CDF这样的专用数据库产品,但你可能不需要担心这些 - 如果你需要,你就会知道。
这些都不等同于SQL。
这并不意味着他们“更好”或“更糟” - 他们只是不一样。丹尼斯福布斯写了great post最近打破了一些针对SQL的奇怪声明。他坚持(并且我同意)这些投诉主要来自人们和商店,他们或者首先选择了错误的工具,或者没有正确使用他们的SQL DBMS(当我没有时,我甚至都不会感到惊讶查看另一个SQL数据库,其中每列都是varchar(50)
,并且在任何地方都没有单个索引或键。
如果您正在实施另一个社交网站并且不太关注ACID原则,请务必开始研究db4o等产品。但是,如果您正在开发一个关键任务业务系统,我非常高度建议您在加入“SQL糟透了”合唱之前再三考虑。首先进行研究,找出各种产品能够和不能支持的功能。
编辑 - 我正忙着写我的答案,几分钟后没有得到更新的问题。话虽如此,SQL基本上与DBMS本身不可分割。如果您运行SQL数据库产品,则使用SQL,句点访问它。
也许你正在寻找语法的抽象; Linq to SQL,Entity Framework,Hibernate / NHibernate,SubSonic以及许多其他ORM工具都提供了类似SQL的语法,这些语法并不完全是SQL。所有这些“编译”到SQL。如果您运行SQL Server,那么您还可以编写CLR函数/过程/触发器,它允许您使用将在数据库内运行的任何.NET语言编写代码;但是,这并不是SQL的替代品,而是对它的扩展。
我不知道你可以在SQL数据库之上分层的任何完整“语言”;如果没有切换到不同的数据库产品,你最终会在管道上看到SQL。
答案 11 :(得分:4)
关系数据库并不是唯一的数据库。我应该对Object-Databases说一句话,因为我没有在其他人的回答中看到它。我有一些使用Zope python框架的经验,使用ZODB来表示对象的持久性而不是RDBMS(好吧,理论上可以用zope中的另一个数据库替换ZODB但是我最后一次检查我没有成功拥有它工作,所以不能积极的那样)。
ZODB的思维方式确实与众不同,更像是对象编程,这种情况恰好是持久的。
ORM可以被视为一种语言
在某种程度上,我认为对象数据库模型是ORM的意义:通过常用的对象模型访问持久数据。它是一种语言并且它获得了一些市场份额,但是现在我们不把它看作是一种语言而是作为一个抽象层。但是我相信在对象数据库上使用ORM比在SQL上使用ORM要高得多(换句话说,我使用某些SQL数据库作为基础层使用的ORM的性能)。
答案 12 :(得分:3)
SQL是事实上的。
试图屏蔽开发人员的框架最终创建了他们自己的特定语言(想到Hibernate HQL)。
SQL很好地解决了一个问题。与高级编程语言相比,学习并不困难。如果您已经掌握了一种函数式语言,那么掌握SQL是一件轻而易举的事。
考虑到领先的数据库供应商提供最先进的数据库(Oracle和SQL Server)支持SQL并且已经投入了多年的优化引擎等,并且所有领先的数据建模软件和变更管理软件都在SQL中处理,我会说这是最安全的选择。
此外,数据库不仅仅是查询。有可扩展性,备份和恢复,数据挖掘。大型供应商支持许多甚至新的“缓存”引擎甚至都不考虑的事情。
答案 13 :(得分:2)
SQL问题激励我在SMEQL处编写一个名为Portland Pattern Repository wiki的查询语言草稿。评论欢迎。它借鉴了函数式编程和IBM实验性Business System 12语言的思想。 (我最初称之为TQL,但后来发现这个名字已被采用。)
答案 14 :(得分:1)
在.NET世界中,虽然它仍然具有SQL风格,但LINQ-to-SQL将允许您对数据进行SQL和内存中.NET处理的良好组合。它还简化了许多没人真正想做的低级数据管道。
如果您想查看完全不同的思维模式的数据库类型,请查看CouchDB。 “更好”显然是一个相对要求,这种非关系数据库“更好”,但仅限于某些情况。
答案 15 :(得分:0)
SQL 语言非常强大,关系数据库管理系统已经并且仍然取得了巨大的成功。但是有一类应用程序需要非常高的可伸缩性和可用性,但不一定是高度的数据一致性(最终的一致性才是最重要的)。通过放宽对完全符合ACID标准的事务的需求,各种系统比RDBMS获得更好的性能和扩展。这些被命名为“NoSQL”,但正如其他人所指出的,这是一个误称:或许它们应该被称为NoACID数据库。
Michael Stonebraker在The "NoSQL" Discussion has Nothing to Do With SQL中介绍了这一点。