前言
1970年的6月,IBM 公司的研究员埃德加·考特 (Edgar Frank Codd) 在 Communications of ACM 上发表了那篇著名的《大型共享数据库数据的关系模型》(A Relational Model of Data for Large Shared Data Banks)的论文。这是数据库发展史上的一个转折。当时还是层次模型和网状模型的数据库产品在市场上占主要位置。所以从这篇论文开始,便拉开了关系型数据库(RDBMS)软件革命的序幕。
什么是数据?
我们生活的这个世界就是一个充满着数据的互联网世界,充斥着大量的数据。也可以说这个互联网世界就是数据世界。数据的来源有很多,比如:人的身份证号码、消费记录、姓名等等都是数据。
什么是数据库?
概念上讲数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,用户可以对文件中的数据进行创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)等操作,简称:“CURD”。简单来讲,数据库就是用来存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。
为什么要使用数据库?
可能有人会想:数据存在文件里不行吗,为什么非要存放在数据库里面。没错,一般的文件里面是可以存放数据,但是在文件中存放的数据有很多缺点(例如:数据的安全性、数据的永久性、数据的易查询性等都是问题)。面对着这么多的问题,数据库就诞生了,光看名字就知道它的功能就是用来存放数据的,它可以很好的保管数据(比如:能存档海量信息,历史数据随时都可查看、提高记录和检索信息的效率、减少重复工作,管理方便、数据库加密管理等等),所以,一般企业或是机构在存数据的时候都会用数据库来存储数据。
数据库的分类:
(1)关系型数据库(SQL):指数据存储的格式可以直观地反映实体之间的关系的数据存储系统。关系型数据库和常见的表格比较相似,关系型数据库中表与表之间是有很多复杂的关联关系的,关系型数据库遵循SQL(结构化查询语言,Structured Query Language)标准。 常见的主要操作有CURD、求和与排序等。关系型数据库对于结构化数据的处理更合适(例如:学生信息、考试成绩、地址等),这样的情况下,关系型数据库就会比NoSQL数据库性能更优,而且精确度更高。由于结构化数据的规模不算太大,数据规模的增长通常也是可预期的,所以针对结构化数据使用关系型数据库更好。关系型数据库十分注意数据操作的事务性、一致性,所以对此方面有要求的使用关系型数据库无疑是很好的选择。
常见主要代表:Oracle、MySQL、DB2、SQLServer。
(2)非关系型数据库(NoSQL):指的是分布式的、非关系型的、不保证遵循ACID原则的数据存储系统。NoSQL数据库技术与CAP理论(简单来说就是一个分布式系统不可能满足可用性、一致性与分区容错性这三个要求,一次性满足两种要求是该系统的上限)、一致性哈希算法(指的是NoSQL数据库在应用过程中,为满足工作需求而在通常情况下产生的一种数据算法)有密切关系。NoSQL数据库适合追求速度和可扩展性、业务多变的应用场景。对于非结构化数据的处理更合适,如文章、评论,这些数据如全文搜索、机器学习通常只用于模糊处理,并不需要像结构化数据一样,进行精确查询,而且这类数据的数据规模往往是海量的,数据规模的增长往往也是不可能预期的,而NoSQL数据库的扩展能力几乎也是无限的,所以NoSQL数据库可以很好的满足这一类数据的存储。NoSQL数据库利用key-value可以大量的获取大量的非结构化数据,并且数据的获取效率很高,但用它查询结构化数据效果就比较差。
目前NoSQL数据库仍然没有一个统一的标准,它现在有以下四种大的分类:
(a)键值对存储(key-value):代表数据库“Redis”,它的优点能够进行数据的快速查询,而缺点是需要存储数据之间的关系。
(b)列存储:代表数据库”Hbase“,它的优点是对数据能快速查询,数据存储的扩展性强。而缺点是数据库的功能有局限性。
(c)文档数据库存储:代表数据库“MongoDB”,它的优点是对数据结构要求不特别的严格。而缺点是查询性的性能不好,同时缺少一种统一查询语言。
(d)图形数据库存储:代表数据库“InfoGrid”,它的优点可以方便的利用图结构相关算法进行计算。而缺点是要想得到结果必须进行整个图的计算,而且遇到不适合的数据模型时,图形数据库很难使用。
关系型数据库(SQL)与非关系型数据库(NoSQL)的区别:
存储方式不同:
关系型数据库采用表格的储存方式, 数据以行和列的方式进行存储,要读取和查询都十分方便。
非关系型数据不适合这样的表格存储方式,通常以数据集的方式,大量的数据集中存储在一起,类似于键值对、图结构或者文档。
存储结构不同:
关系型数据库按照结构化的方法存储数据, 每个数据表都必须对各个字段定义好(也就是先定义好表的结构,再根据表的结构存入数据),这样做的好处就是由于数据的形式和内容在存入数据之前就已经定义好了,所以整个数据表的可靠性和稳定性都比较高,但带来的问题就是一旦存入数据后,如果需要修改数据表的结构就会十分困难。
非关系型数据库由于面对的是大量非结构化的数据的存储,它采用的是动态结构,对于数据类型和结构的改变非常的适应,可以根据数据存储的需要灵活的改变数据库的结构。
存储规范不同:
关系型数据库为了避免重复、规范化数据以及充分利用好存储空间,把数据按照最小关系表的形式进行存储,这样数据管理的就可以变得很清晰、一目了然,当然这主要只是一张数据表的情况。如果是多张表情况就不一样了,因为这时的数据涉及到多张数据表。
非关系型数据库就像我们刚才说到的那样,对于非结构化数据的处理更合适,如文章、评论,这些数据不像关系型数据那样,每个都是唯一的、独立的,数据与数据之间不存在联系。所以在存储规范自然就不像关系数据那样需要很多规范。
扩展方式不同:
关系型数据库将数据存储在数据表中,数据操作的瓶颈出现在多张数据表的操作中,而且数据表越多这个问题越严重,如果要缓解这个问题,只能提高处理能力,也就是选择速度更快性能更高的计算机,这样的方法虽然可以一定的拓展空间,但这样的拓展空间一定有非常有限的,也就是关系型数据库只具备纵向扩展能力。
非关系型数据库由于使用的是数据集的存储方式,它的存储方式一定是分布式的,它可以采用横向的方式来开展数据库,也就是可以添加更多数据库服务器到资源池,然后由这些增加的服务器来负担数据量增加的开销。
查询方式不同:
关系型数据库采用结构化查询语言(SQL)来对数据库进行查询,SQL早已获得了各个数据库厂商的支持,成为数据库行业的标准,它能够支持数据库的CURD(增加,更新,查询,删除)操作,具有非常强大的功能,SQL可以采用类似索引的方法来加快查询操作。
非关系型数据库使用的是非结构化查询语言(NoSQL),它以数据集为单位来管理和操作数据,由于它没有一个统一的标准,所以每个数据库厂商提供产品标准是不一样的,NoSQL中的文档Id与关系型表中主键的概念类似,NoSQL数据库采用的数据访问模式相对SQL更简单而精确。
规范化:
在数据库的设计开发过程中开发人员通常会面对同时需要对一个或者多个数据实体(包括数组、列表和嵌套数据)进行操作,这样在关系型数据库中,一个数据实体一般首先要分割成多个部分,然后再对分割的部分进行规范化,规范化以后再分别存入到多张关系型数据表中,这是一个复杂的过程。但是目前有相当多的软件开发平台都提供一些简单的解决方法,例如:可以利用ORM层(也就是对象关系映射)来将数据库中对象模型映射到基于SQL的关系型数据库中去以及进行不同类型系统的数据之间的转换。对于NoSQL数据库则没有这方面的问题,它不需要规范化数据,它通常是在一个单独的存储单元中存入一个复杂的数据实体。
事务性:
关系型数据库强调ACID规则(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)),可以满足对事务性要求较高或者需要进行复杂数据查询的数据操作,而且可以充分满足数据库操作的高性能和操作稳定性的要求。并且关系型数据库十分强调数据的强一致性,对于事务的操作有很好的支持。关系型数据库可以控制事务原子性细粒度,并且一旦操作有误或者有需要,可以马上回滚事务。
非关系型数据库强调BASE原则(基本可用(Basically Availble)、软状态(Soft-state)、最终一致性(Eventual Consistency)),它减少了对数据的强一致性支持,从而获得了基本一致性和柔性可靠性,并且利用以上的特性达到了高可靠性和高性能,最终达到了数据的最终一致性。NoSQL数据库虽然对于事务操作也可以使用,但由于它是一种基于节点的分布式数据库,对于事务的操作不能很好的支持,也很难满足其全部的需求,所以NoSQL数据库的性能和优点更多的体现在大数据的处理和数据库的扩展方面。
读写性能:
关系型数据库十分强调数据的一致性,并为此降低读写性能付出了巨大的代价,虽然关系型数据库存储数据和处理数据的可靠性很不错,但一旦面对海量数据的处理的时候效率就会变得很差,特别是遇到高并发读写的时候性能就会下降的非常厉害。
非关系型数据库相对关系型数据库优势最大的恰恰是应对大数据方面,也就是对于大量的每天都产生非结构化的数据能够高性能的读写,这是因为NoSQL数据库是按key-value类型进行存储的,以数据集的方式存储的,因此无论是扩展还是读写都非常容易,并且NoSQL数据库不需要关系型数据库繁琐的解析,所以NoSQL数据库大数据管理、检索、读写、分析以及可视化方面具有关系型数据库不可比拟的优势。
我们学习的是ORACLE(甲骨文)公司(就是收购Sun公司的甲骨文公司)的Oracle数据库(Oracle Database)。Oracle数据库是关系型数据库中的大型数据库,存储量大,而且也非常安全。学习起来相对于其他关系型数据库来说比较难,但是关系型数据库的语言格式都基本保持一致,都是规范的使用SQL语句来编写的,所以在使用其他的关系型数据库时都基本很容易上手,因为语法都差不太多。在实际开发中,是根据需求来选择数据库的(比如:大项目采用Oracle/DB2,中型采用MsSQL,MySQL,小型采用Access)。总之呢,可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。
那么既然谈到了Oracle数据库自然就少不了了解ORACLE公司的发展史。
ORACLE的起源:
1977年6月,Larry Ellison 与 Bob Miner 和 Ed Oates 在硅谷共同创办了一家名为软件开发实验室(Software Development Laboratories,SDL)的计算机公司(ORACLE公司的前身)。那个时候,32岁的Larry Ellison,这个读了三家大学都没能毕业的辍学生,还只是一个普通的软件工程师。公司创立之初,Miner是总裁,Oates为副总裁,而Ellison,因为一个合同的事情,还在另一家公司上班。没多久,第一位员工Bruce Scott(Oracle数据库软件中有个叫Scott的用户,就是这个Bruce Scott,至于Scott用户的密码为什么是Tiger,那是Scott的女儿养的猫的名字。Scott工号是4)加盟进来,在Miner和Oates有些厌倦了那种合同式的开发工作后,他们决定开发通用软件,不过他们还不知道自己能开发出来什么样的产品。Oates最先看到了埃德加·考特的那篇著名的论文连同其他几篇相关的文章并推荐Ellison和Miner也阅读一下。Ellison和Miner预见到数据库软件的巨大潜力(跟着IBM走),于是,SDL开始策划构建可商用的关系型数据库管理系统( RDBMS )。
很快他们就弄出来一个不太像样的产品,或者具体的说更像一个Demo。根据 Ellison 和 Miner 他们在前一家公司从事的一个由中央情报局投资的项目代码,他们把这个产品命名为 ORACLE。因为他们相信,ORACLE(字典里的解释有"神谕, 预言"之意)是一切智慧的源泉。1979年,SDL 更名为关系软件有限公司(Relational Software,Inc.,RSI),毕竟"软件开发实验室"不太像一个大公司的名字。1983年,为了突出公司的核心产品,便再次更名为ORACLE (Oracle Systems Corporation)。
ORACLE的历史:
1979年,RSI公司(那时候公司叫“RSI”还不叫“ORACLE”)在夏季发布了可用于DEC公司的PDP-11计算机上的商用ORACLE产品,这个数据库产品整合了比较完整的SQL实现,其中包括子查询、连接及其他特性。出于市场策略,ORACLE公司宣称这是该产品的第二版,但却是实际上的第一版。这就是ORACLE这种“要命”的市场策略,事实上,这种策略有时候也是非常成功的。
1983年3月,RSI发布了Oracle第3版。Miner和Scott历尽艰辛用C语言重新写就这一版本。要知道,C语言当时才刚推出不久,用它来写ORACLE软件也是具有一定的风险的,但除此之外,别无他法。很快就证明了这样做是多么的正确:C编译器便宜而又有效,还有很好的移植性。从现在起,ORACLE产品有了一个关键的特性:“可移植性”。同样是1983年,IBM发布了姗姗来迟的Database 2(DB2),但只可在MVS上使用。不管怎么说,ORACLE已经占取了先机。(在开发第三版还没有结束的时候,Scott离开了ORACLE。当时用C语言改写ORACLE的压力很大,无休止的软件调试终于让Scott不堪重负,选择了一走了之。把剩下的重担交给了Miner一个人。在出售了自己的%4的股票之后,Scott后来创建了Gupta公司(现更名为Centura Software)和PointBase公司(提供百分之百纯Java嵌入式数据库),都是开发和数据库相关的产品。多年后有人问到他的%4的ORACLE股票的时候,Scott也只能报以一笑了。如果能坚持下来,那是一笔几亿美金的财富。不过当时的Scott没有那么多的想法,他只是太累了。很长一段时间里,公司研发由Miner独力承担。Miner视金钱如无物,为人低调,和Ellison的锋芒必露形成鲜明的对比。在公司里,大家一致认为他是老好人,他也深受员工爱戴。Ellison是公司的大脑,Miner则当之无愧的成为公司的心脏。他是个沉默的英雄,正如Steve Jobs背后的Steve Wozniak一样。)
1984年10月,ORACLE发布了第4版产品。产品的稳定性总算得到了得到了一定的增强,用Miner的话说,达到了“工业强度”。
1985年,ORACLE发布了5.0版。有用户说,这个版本算得上是Oracle数据库的稳定版本。这也是首批可以在Client/Server模式下运行的的RDBMS产品,在技术趋势上,Oracle数据库始终没有落后。(就在这一年,当时曾经的最大的独立软件公司Cullinet(主要销售网状数据库)已经如流星般陨落。ORACLE的主要竞争对手是Ingres数据库。Ingres在加州大学伯克利分校诞生,主要的设计者是当时鼎鼎大名的Michael Stonebraker教授。可以说Ingres数据库软件是上个世纪80年代技术上最好的数据库,Ingres市场分额的快速增长已经给ORACLE造成了很大的压力。巧的是,这个时候IBM公司再一次伸出了“上帝之手”。Ingres使用的是Stonebraker发明的QUEL(Query Language)的查询技术,这和IBM的SQL大不相同。在某些地方QUEL甚至要优于SQL。IBM当时担心Ingres把QUEL变成标准会对自己不利。经过一番衡量,决定把自己的SQL提交给数据库标准委员会。而Stonebraker教授可不打算把QUEL提交给数据库标准委员会,学院派的他认为这么做实际上是扼杀了创新精神。可以看出,学院派的思想大都会把事情搞杂。)
1986年3月12日,ORACLE公司以每股15美元公开上市,当日以20.75美元收盘,公司市值2.7亿美元。3月13日,微软以每股21美元的发行价上市,以28美元收市,公司市值达到7亿美元。远远超过了ORACLE。套有成功光环的微软和比尔·盖茨遮盖住了ORACLE和Ellison的光芒,可能这也是Ellison敌视微软的开始。
1988年,Oracle第6版发布。由于过去的版本在性能上屡受诟病,Miner带领着工程师对数据库核心进行了重新的改写。引入了行级锁(row-level locking)这个重要的特性,也就是说,执行写入的事务处理只锁定受影响的行,而不是整个表。这个版本引入了还算不上完善的PL/SQL(Procedural Language extension to SQL)语言。第6版还引入了联机热备份功能,使数据库能够在使用过程中创建联机的备份,这极大地增强了可用性。(在第六版刚发布之后,很多迫不及待开始使用的用户就怨声载道。这是个根本就没有测试好就进行发布的产品(也怪Ellison,大话总要说在前头,只好自尝苦果)。用户开始对ORACLE大肆抨击,ORACLE的一些对手也开始落井下石,针对ORACLE产品的一些弱点进行攻击,噩梦一直延续到Oracle第七版的推出才结束。)
1992年6月,Oracle第7版终于闪亮登场。这一次公司吸取了第六版匆忙上市的教训,听取了用户的多方面的建议,并集中力量对新版本进行了大量而细致的测试。该版本增加了许多新的性能特性:分布式事务处理功能、增强的管理功能、用于应用程序开发的新工具以及安全性方法。(Oracle第七版是ORACLE真正出色的产品,取得了巨大的成功。这个版本的出现真是好时机,当时Sybase公司的数据库已经占据了不少份额,ORACLE借助这一版本的成功,一具击退了咄咄逼人的Sybase。公司的销售人员这次算到了给用户兑现空头许诺的时候。公司经过两三年的治理,终于摆脱了种种麻烦,重新开始健康发展,销售额也从92年的15亿美元变为四年后的42亿美元。)
1997年6月,Oracle第8版发布。Oracle 8支持面向对象的开发及新的多媒体应用,这个版本也为支持Internet、网络计算等奠定了基础。同时这一版本开始具有同时处理大量用户和海量数据的特性。
1998年9月,ORACLE公司正式发布Oracle 8i(“i”代表Internet)。这一版本中添加了大量为支持Internet而设计的特性。这一版本为数据库用户提供了全方位的Java支持。Oracle 8i成为第一个完全整合了本地Java运行时环境的数据库,用Java就可以编写Oracle的存储过程(只要是能够打击微软的武器,ORACLE都要派上用场)。
2001年6月,在ORACLE OpenWorld大会中,ORACLE发布了Oracle 9i。在Oracle 9i的诸多新特性中,最重要的就是Real Application Clusters(RAC)了。说起Oracle集群服务器,早在第五版的时候,ORACLE就开始开发Oracle并行服务器(Oracle Parallel Server ,OPS),并在以后的版本中逐渐的完善了其功能,不过,严格来说,尽管OPS算得上是个集群环境,但是并没有体现出集群技术应有的优点。
2003年6月初,ORACLE突然宣布51亿美金收购仁科(PeopleSoft),业内再次震动。此举又一次露出ORACLE 一贯善于进攻的本性。(要知道,ORACLE在发展过程中很少对企业进行收购的,那么收购仁科目的何在?首先,ORACLE觊觎企业应用软件市场已久,但苦于不能进一步扩大市场份额,尤为重要的是,一旦成功,可以直接对最大的敌人IBM进行打击,还可以阻击SAP等巨头的强势。时至今日,ORACLE依然以不达目的不罢休的态势和仁科缠斗)。
2003年9月8日,在旧金山举办的ORACLE World大会上,Ellison宣布下一代数据库产品为“Oracle 10g”(“g”代表“grid ,网格”)。Oracle应用服务器10g(Oracle Application Server 10g)也将作为甲骨文公司下一代应用基础架构软件集成套件。这一版的最大的特性就是加入了网格计算的功能。ORACLE宣称10g可以作为网格计算的基础,矛头直指最大的敌人IBM的"随需应变"!看来,ORACLE公司已经把这一次的"赌注"押在了网格计算的大市场上。(如果说,IBM是IT产业中的一头巨鲸,那么ORACLE一定就是一条大鲨鱼:咄咄逼人,善于进攻。Ellison绝对是造概念的能手,只要是能引领出新的卖点,出些新概念,那也是值得的。那么何谓网格计算?网格计算可以把分布在世界各地的计算机连接在一起,并且将各地的计算机资源通过高速的互联网组成充分共享的资源集成。通过合理调度,不同的计算环境被综合利用并共享)。
2004年12月13日,ORACLE公司宣布签订了以每股26.50美元、总计约 103 亿美元的代价收购 仁科(PeopleSoft) 的最终协议。历时十八个月的争斗终于尘埃落定。
2005年,ORACLE在数据库的市场的份额首次超越IBM与微软的总和,同年又以58亿美元收购了Siebel公司,推动其ERP和CRM应用程序以及商业智能领域的扩展。
2007年11月,Oracle 11g正式发布,功能上大大加强。11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Information Lifecycle Management)等多项创新。大幅提高了系统性能安全性,全新的Data Guard最大化了可用性,利用全新的高级数据压缩技术降低了数据存储的支出,明显缩短了应用程序测试环境部署及分析测试结果所花费的时间,增加了RFID Tag、DICOM医学图像、3D空间等重要数据类型的支持,加强了对Binary XML的支持和性能优化。
2008年,ORACLE又以72亿美元收购了BEA公司。
2010年,ORACLE在数据库系统市场的份额首次突破50%,同年又完成了对SUN(Java的创始公司)公司的收购,并以SUN公司的的专利状告Google专利侵权,诉求高达61亿美元的损失补偿。但是此案最后被判不成立,除了律师费以外,ORACLE还掏了一百多万美金的法庭费。
2011年,ORACLE开始大量收购基于云计算的企业级软件和服务公司,并高调进入云计算领域。
2012年12月20日,软件巨头ORACLE公司宣布已与上市公司Eloqua达成协议,并将收购这家基于云的自动化营销与营收绩效管理软件公司。
2013年2月4日以每股29.25美元作价收购网络传输产品制造商Acme Packet,交易规模约为17亿美元。
2013年6月26日,ORACLE发布了Oralce 12C。云(cloud)计算设计。12C引入了CDB与PDB的新特性,在Oracle 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在Oracle 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入Oracle 12C后,实例与数据库可以是一对多的关系。
2013年7月15日起ORACLE公司正式由纳斯达克转板至纽约证券交易所挂牌上市。转板至纽交所后,ORACLE公司将沿用“ORCL”这一交易代码。
2013年,ORACLE已超越 IBM,成为继微软后全球第二大软件公司。
2014年,Ellison辞去CEO一职,将甲骨文交给了Hurd和Catz。
2015年,ORACLE营业额高达382亿美元。
2017年6月7日发布的2017年美国《财富》500强,甲骨文公司排名第81位,营业收入370.47亿美元。
2017年7月,从此年开始ORACLE改变了以往的数据库软件发布流程,采用年度Release和季度更新的策略。
2018年2月16日,Oracle 18C发布。还是秉承着 Oracle 的 Cloud first 理念,Oracle 18C 现在 Cloud 和 Engineered Systems 上推出。Oracle 18C号称是一款自治性的数据库,可以减少很多DBA的工作,很多从事DBA工作的人员是不是要担心自己的工作受到影响?其实Oracle 18C上并未体现的特别明显,不过这是未来的一个趋势和信号!
目前Oracle已更新到ORACLE 19C版本。