为什么数据库没有集成为语言功能?


25

是否有任何编程语言都具有内置数据库作为一流语言功能,而不是连接到外部SQL(或其他)数据库?这种功能的弊端和好处是什么?这样的功能会是什么样子,它将如何改变我们的编程方式?


17
我以为SQL是一种语言。:D
凯文·坎图

8
.NET具有LINQ for SQL,我认为这是解决一般问题的正确方法。您不应该锁定特定的数据库,也不能创建足够通用的东西,而不能实现那里所有内容的所有功能。就像我一样,LINQ仍然很棒。
工作

linq2SQL已死,由linq2EF取代,但原理相同
BlackICE 2010年

3
不幸的是,Linq2EF具有一些讨厌的,仅适用于Microsoft的扩展,这意味着如果您做任何复杂的事情,都将使用它来锁定SQLServer。
gbjbaanb

1
@Job“您不应该锁定到特定的数据库中”正如通常所说,我不能完全不同意这个想法。相反,我会完善这种哲学或停止拥护它。例如,我不会将UI层代码锁定到特定的数据库中。但是,我绝对可以将服务层代码锁定到特定的数据库中。
Michael O'Neill

Answers:


15

我能想到的唯一语言是旧的xBase语言,例如DBase,Clipper和FoxPro。有一个GNU项目提供了一个免费的且几乎兼容的版本,称为Clip

也是Pick Basic,它将编程语言直接绑定到数据库平台。

已经完成了。进化的死胡同限制了语言访问数据的方式。


2
您能解释为什么它是进化的死胡同吗?我不打算实施一个,只是很好奇。
VirtuosiMedia

1
@VM使用API​​并保持语言,库和运行时具有明显的趋势。到目前为止,定义良好的API允许以通用方式访问数据;无论语言,数据库,甚至数据库架构都是常见的。大多数通用语言都将通用数据库API作为标准库的一部分。同上文件和HTTP访问。不再需要将其添加到语言中。
萨尔

1
本地API和远程API的调用时间有几个数量级的差异,如果存在网络接口,则添加更多。在数据库堆栈中使用语言仍具有明显的实际优势。
JE队列

@Xepoch当然可以,如果您希望将自己锁定在该供应商的数据库语言实现中。
BlackICE 2010年

1
@David,重新阅读问题,祈祷说这将是什么语言,而不是用于供应商锁定?
JE队列

29

语言是“小”,数据库是“大”;因此,无论何时将两者结合在一起,它都不是以数据库为特征的语言,而是以语言为特征的数据库。许多数据库都有一些专有语言,例如PL / SQL,T-SQL。


语言如何“小”?
宫坂丽

这是一个感知问题。当然,数据库似乎具有更大的代码库,更大的文档,更大的磁盘需求(即使我们不考虑实际数据);但是这些比较并不公平,因为大多数数据库都带有一种甚至几种编程语言。
user281377

3
Rei:您还没有仔细研究PL / SQL,对吗?顺便说一句,Oracle在RDBMS中也包含一个JVM。
user281377 2011年

3
Rei:实际上,许多人至少使用业务逻辑部分来使用PL / SQL编写应用程序。您可能知道,PL / SQL也是Oracle Forms中使用的语言,因此您基本上可以编写和运行永远不会接触数据库的PL / SQL程序。但是,实际上,PL / SQL与Oracle RDBMS结合使用。
user281377 2011年

2
该死的,从来没有想过。
宫坂丽

16

我不一定认为正确的问题是“为什么不在那里?” 但是“为什么要有?”。将数据库作为语言的特征将会带来什么?请记住,语言是编程堆栈的最底层。使语言膨胀会影响一切。因此,语言设计人员在添加新功能(特别是那些涉及此类投资的功能)时需要慢一些。


6
因为您想要类型检查甚至简单的名称检查的好处,所以当您跨越查询语言和编程语言的边界工作时。
Macneil 2010年

4
@ Macneil,ORM工具现在可以执行此操作。当API可以做到时,应将其附加到语言中什么?
sal 2010年

1
@sal以便应用程序的分发者不必为了获得原子写入和对其缓存,搜索索引等的一致性检查而捆绑庞大的DBMS。这就是SQLite存在的原因:“ 与之竞争fopen() ”。
Damian Yerrick'1

@sal:大概是由于类似的原因,当API可以将正则表达式或浮点数绑定到某些语言中时。因为有人在写一种语言,并决定他们足够基础才能保证使用特殊语法。当然,这是一个通用的原因,它不是一个有用的答案;-)
史蒂夫·杰索普

14

有3种符合您要求的旧系统:

  1. 选择
  2. 流行性腮腺炎
  3. Microsoft Access

Pick和MUMPS是在有关关系型数据库的第一篇学术论文之前开发的(距第一个基于商业SQL的数据库系统进入市场大约十年了-这是我们现在称为Oracle的公司; IBM在产品上的首次尝试失败了,后来成功的基于SQL的系统)。您可能会发现它们仍在使用中(我们的本地公共交通系统直到最近才将其用于旅行计划系统)。您不希望选择Pick或MUMPS,而且我能给的最好建议是“双手悬空离开键盘!” 如果您确实与他们有任何关系,那么“您会后悔”这句话应该会在您耳边响起。

Microsoft Access在IT界受到严重嘲笑和批评,因为对于非开发人员而言,很容易使用Access制作关键的业务应用程序,并将其转变为公司无法生存的东西。也很可能有许多开发人员开始通过MS Access进行开发,并且随着事情不断陷入困境,他们学习了如何修复它们(传统上,第一步是学习视觉基础,然后先在VB中重写Access应用程序,然后在“更好”的东西)。可以使行为良好的Access应用程序运行时分发大量数据(我已经看过了),但是做事更简单,而且制作(和维护)设备所需的技能要少得多VB和SQL Server之外的行为正常的应用程序。

从SQL Server 2005开始,Microsoft引入了将CLR放入存储过程和函数中的功能。而且,如果您想对此加以棘手,则可以创建数据类型,然后将其用作数据库中的列。我认为Oracle与Java有相似之处。

话虽如此,我认为没有什么可以阻止您创建一个或对其进行假设。Pick和MUMPS比大多数编码器都古老,它们反映了一种看待世界的非常轻松的方式。

我个人的建议是使事情分开。使用一种善于处理项目所需数据的语言(需要注意的是,有时“最佳”语言是可以轻松找到可以读写代码的程序员的语言)。使用擅长保留项目所需数据的数据库系统。


尽管我认为+1是足够熟练的程序员来制作可伸缩的Access应用程序,但它应该拥有更好的工作环境。
拉里·科尔曼

3
Access不是一种编程语言,而是一种集成的开发和运行时环境。VBA使用的语言与其他Office产品中用于宏编程的语言相同,并且不是特定于Access的。仍然可以通过各种提供程序对JET驱动程序进行数据库访问。
杰里米

1
除了您提到的三个之外,还有几种4GL环境:Oracle Forms,CA OpenROAD(nee Ingres Windows4GL)和Unify的Accell(仅用于命名与我合作的环境)。
TMN 2010年

另外,我不确定Access是否真的是“旧版”,无论您多么想成为它:)
haylem 2012年

+1用于流行语言流行的腮腺炎数据库。
詹姆斯·安德森

4

将数据库添加到编程语言中可能仅适合极少数的用户。如果他们想使用某些非RDBMS功能怎么办?还是根本不想使用数据库?对于这种用例,编译器将不必要地肿。


4

呃。

好吧,首先,您要问为什么该语言所使用的框架没有提供数据库。语言仅是表达您想要在集合语法中完成的事情的一种手段。它并没有真正提供这样的服务。:)

也就是说,有几个原因。

  • 构建高效的数据库存储系统是一个难题,可能比构建.NET Framework 的数量级或更大。如果一个团队试图在其框架中包括一个数据库,那将是他们最终的工作。

  • 获取负载的数据库应位于其自己的单独计算机上,而不是在访问它的代码过程中。

  • ORM提供了很多类型安全性和编译时检查,这将是此类操作的好处,而实际上没有使框架尝试成为数据库。

就是说,我想在框架中包含某种SQLite实现会很整洁,对数据访问需求较小的应用程序可以对之进行操作。我不确定它在非平凡的应用程序中是否有用。


嵌入式sqlite确实很棒,如果您没有它,语言设计者最终只会使用XML作为存储机制:(
gbjbaanb


2

我认为您的实际问题是“为什么数据库没有提供任何编程语言”。

通用语言将所有IO视为一个整体,无论是向磁盘,网络摄像头,网络,屏幕,内存中的位置写入或读取磁盘,网络摄像头,网络,屏幕,内存中的位置-都是IO,而这正是编程语言所关注的全部用。

实际上,除了对堆和堆栈进行读/写之外,大多数编程语言甚至不执行任何实际的IO。某些语言提供了用于表达 IO操作的本机功能(例如,BASIC中的print 命令),但是大多数语言只是将它们视为常规函数调用(例如,printf在C中),并让库处理实际的编写。

诸如C#之类的某些语言提供了用于表达查询的语言功能,但即使如此,这些也只是列表(或IEnumerables,在.NET中称为s)的最基本数据结构上的表达式,这些表达式已由库转换为SQL操作-语言本身仍在使用非常抽象的IO概念。

至于为什么将数据库程序包构建到编程语言的标准库中并不是一个好主意,这很可能是因为标准库中的其他内容通常都不依赖于数据库功能。


数据库库附带了许多编程语言。Python和PHP都具有sqlite。Visual Studio随SQL Server Express一起提供。
2011年

这些是数据库接口,而不是数据库本身。.NET运行时不随Visual Studio或SQL Server Express一起提供。
宫阪丽

@ReiMiyasaka Python标准库包含整个SQLite引擎,因为SQLite只是程序链接到的C库,而不是单独的进程或其他任何东西。
Damian Yerrick'1

2

是。AS / 400平台上的语言具有数据库的本机一流支持。

这是因为AS / 400平台已将数据库完全集成到各处,并且允许使用许多非常好的功能,例如易于浏览结果集并在更新过程中更新值。


0

取决于语言和平台。例如,在使用C的同时使用多种数据库对我来说是微不足道的,我只使用适当的库。

语言必须保持其标准实现,这通常意味着为某人提供所需的最小数量,以便能够构建他们想要构建的任何东西。其他所有内容都变成了一个库,或者成为了他人所维护语言的扩展。

至少对于遵循由组织(例如ISO)建立的标准的语言而言,情况就是如此。


0

如上所写,该问题在某种程度上是错误的,如上面的一些反例所示。

因此,我首先将问题简化为:“为什么通常不将DBMS集成为通用,高级编程语言的功能?”

出于同样的原因,通常不会内置其他软件产品,例如操作系统,文件系统,Web服务器,缓存层等。通用语言通常在高于此类产品的抽象级别上运行。所以这是合理的程序员来实现DBMS 通用语言,并且DBMS甚至可以公开其父语言或DB特定的声明性语言的各个方面,以供DB程序员使用。但是在编写DBMS时有太多设计选择,因此明智的选择是将它们修复为通用编程语言。如果您确实要解决它们,则会遇到MUMPS这样的情况,这两种情况的纠缠导致整个行业陷入鸡与蛋的问题,被过时的DBMS和过时的编程语言所困扰。


0

用于在NonStop / SQL中工作,该SQL已完全集成到NonStop / C,NonStop / C ++,NonStop / Cobol,NonStop / Fortran和其他语言中,并且已与NonStop / Guardian(计算机所使用的操作系统)完全集成跑了

我认为这可能是您可以获得的最接近的集成,数据库是操作系统的文件系统。这也是一个死胡同,无法解耦任何组件,数据库,操作系统,硬件以及上面编写的任何软件,它们永远都不能单独使用,而是移植到另一个环境。

您将在PC上获得的最接近的产品可能是MS Access,紧随其后的是Embarcadero / Borland Delphi。

之后,您要查看的是应用程序中的嵌入式数据库,这对于那些创建需要一组不容易存储在简单配置文件中和/或需要在应用程序运行时进行定期更新的层次结构数据的独立应用程序的应用程序而言,可能具有有限的吸引力。或者对于希望拥有可移植版本的应用程序的用户,该版本可以维护较大数据库的一部分的快照,并可能在应用程序可以建立连接时与较大数据库同步(例如,经常无法到达的销售人员)公司网络仍需要为其客户群或需要病历但由于无法访问网络而无法连接到医院网络的现场医生的销售数据)。


0

作为Visual Foxpro的前开发人员,我很难理解,没有主流语言将关系模型定义为语言的一部分。

拥有完整的数据库引擎不是一个好主意,但是拥有“ SQL”语言可能会非常有用。

在OO中,存在阻抗不匹配。发生这种情况是因为物体和物体彼此不一样。但是,如果让一种语言让我定义表,字段,关系,约束等(不将其绑定到特定存储),将非常强大。另外,制作ORM将会更多的一对一映射。

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.