非关系型数据库

“数据库”起源于20世纪60年代后期,1970年IBM的研究员E.F.Codd博士连续发表论文提出关系模型,在之后的几十年中,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型。

关系型数据库的瓶颈

关系型数据库的最大特点就是事务的一致性,但是,在网页应用中,尤其是SNS应用中,一致性却显得不是那么重要,用户A看到的内容和用户B看到的内容更新不一致是可以容忍的,或者说,两个人看到同一好友的数据更新的时间差那么几秒是可以容忍的,因此,关系型数据库的最大特点在这里已经不是那么重要了。
相反地,关系型数据库为了维护一致性所付出的巨大代价就是其读写性能比较差,而像微博、facebook这类SNS的应用,对并发读写能力要求极高,关系型数据库已经无法应付(在读方面,传统上为了克服关系型数据库缺陷,提高性能,都是增加一级memcache来静态化网页,而在SNS中,变化太快,memchache已经无能为力了),因此,必须用新的一种数据存储结构来代替关系数据库。

关系数据库的另一个特点就是表结构的存储结构,因此其扩展性极差,而在SNS中,系统的升级,功能的增加,往往意味着数据结构巨大变动,这一点关系型数据库也难以应付,需要新的结构化数据存储。

于是,非关系型数据库应运而生,NoSQL指 “Not Only SQL”,也被解释为“non-relational”,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。

NoSQL有如下优点:易扩展,NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展的能力。大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。

非关系型数据库的分类

键值(Key-Value)存储数据库

键值数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署、高并发。但是如果数据库管理员(DBA)只对部分值进行查询或更新的时候,Key/value就显得效率低下了。

典型产品有Tokyo Cabinet/Tyrant, Redis, Voldemort, MemcacheDB、BerkeleyDB。

列存储数据库

列存储数据库将数据存在列族(column family)中,一个列族存储经常被一起查询的相关数据。这部分数据通常是用来应对分布式存储的海量数据。键仍然存在,但是他们的特点是指向了多个列。
在这里插入图片描述
对于大多数的分析场景中,实际关注的数据很多时候都只有那么一列或者少数几列的数据。所以在列存储数据库的设计中,大部分的分析查询都只需要读取某一个(或者几个)表的几列,而不需要像传统以行为导向的数据库那样需要扫描整个表的数据。
在这里插入图片描述

  • 列存储数据库在增加数据时IO不连续,需要在每个列后面追加数据,写入性能不佳,绝大多数是读取操作。
  • 数据是批量导入的,导入后不修改。
  • 每个表有很多列,分析操作经常只涉及小部分列。

典型产品有Cassandra, HBase, Riak。

什么情况下用column-oriented存储:

  1. 在较少的列上aggregate跨多行:列式存储只读全部数据集的一个子集,而不用扫描全部table;
  2. 当需要一次在一个列上insert/update多行new values。
  3. Storage efficiency:压缩效率远高于行式存储。由于列数据是uniform type,可以利用similarity of adjacent data进行压缩。(但是这种adjacent compression,相应地造成了random access的困难性,需要额外的机制来保证对压缩数据的访问。)

什么情况下用row-oriented存储:

  1. 当需要一次操作单行的多列,尤其当单行size较小时,可以retrieved with a single disk seek;
  2. 当insert一整行时。

文档型数据库

文档型数据库的灵感是来自于Lotus Notes办公软件的,可以看作是键值数据库的升级版,一般用于存储半结构化的数据。在文档数据库中文档是处理信息的基本单位,一般采用XML、YAML 、JSON作为存储协议。由于文档数据库中的文档也需要一个唯一的key来标识文档(当然key可以是JSON、XML结构),文档的内容可以看做value,因此一般把文档数据库也归到Key-Value Store Database中,当然所有的XML数据库其实也可以归成文档数据库。

文档数据库很适合CMS、知识库、OA系统,用于存储新闻稿件、电子邮件、书籍、Web页面、多媒体文件等半结构化的数据。

典型产品有CouchDB, MongoDb.,国内也有文档型数据库SequoiaDB,已经开源。

图形(Graph)数据库

图形结构的数据库是使用灵活的图形模型,并且能够扩展到多个服务器上。它将数据以图的方式存储,实体会被作为顶点,而实体之间的关系则会被作为边。主要存储关于图形、网络的信息,例如社会关系、路线图、交通链接等。

典型产品有Neo4J, InfoGrid, Infinite Graph。
在这里插入图片描述

常用的非关系型数据库软件

  1. MongoDB(Document-oriented)
    在这里插入图片描述
    MongoDB是一个面向文档的开源NoSQL数据库,使用JSON之类的文档来存储任何数据,它是用c++写的。在MongoDB中,JavaScript可以作为查询语言使用。通过使用sharding MongoDB水平伸缩。它在流行的JavaScript框架中非常有用。

特点:提供高性能;自动分片;运行在多个服务器上;支持主从复制;数据以JSON样式文档的形式存储;索引文档中的任何字段;由于数据被放置在碎片中,所以它具有自动负载平衡配置;支持正则表达式搜索;在失败的情况下易于管理。

优点:易于安装;MongoDB Inc.为客户提供专业支持;支持临时查询;高速数据库;无模式数据库;横向扩展数据库;性能非常高。

缺点:不支持连接;数据量大;嵌套文档是有限的;增加不必要的内存使用。
2. Cassandra(Column-oriented)
在这里插入图片描述
Cassandra是Facebook为收件箱搜索开发的,是一个用于处理大量结构化数据的分布式数据存储系统。通常,这些数据分布在许多普通服务器上,还可以添加数据存储容量。由于集群中的所有节点都是相同的,因此不需要处理复杂的配置。Cassandra是用Java编写的。Cassandra查询语言(CQL)是查询Cassandra数据库的一种类似sql的语言。因此,Cassandra在最佳开源数据库中排名第二。Facebook、Twitter、思科(Cisco)、Rackspace、eBay、Twitter、Netflix等一些最大的公司都在使用Cassandra。

特点:线性可伸缩;保持快速响应时间;支持原子性、一致性、隔离性和耐久性(ACID)等属性;使用Apache Hadoop支持MapReduce;分配数据的最大灵活性;高度可伸缩;点对点架构。

优点:高度可伸缩;无单点故障;Multi-DC复制;与其他基于JVM的应用程序紧密集成;更适合多数据中心部署、冗余、故障转移和灾难恢复。

缺点:对聚合的有限支持;不可预知的性能;不支持特别查询。
3. Redis(Key-Value)
在这里插入图片描述
Redis是高性能的Key-Value型数据库,用C语言编写的。Redis的数据都是缓存在内存中。区别是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。

特点:自动故障转移;将其数据库完全保存在内存中;事务;Lua脚本;将数据复制到任意数量的从属服务器;钥匙的寿命有限;LRU驱逐钥匙;支持发布/订阅。

优点:支持多种数据类型;很容易安装;非常快(每秒执行约11万组,每秒执行约81000次);操作都是原子的;多用途工具(在许多用例中使用)。

缺点:不支持连接;存储过程所需的Lua知识;数据集必须很好地适应内存。
4. HBase(Column-oriented)
在这里插入图片描述
HBase是谷歌为BigTable数据库设计的分布式非关系数据库,主要目标之一是托管数十亿行X数百万列。可以随时添加服务器来增加容量,多个主节点将确保数据的高可用性。HBase是用Java 8编写的,它是在Apache下授权的。Hbase还简单地利用Java API进行客户访问。

特点:支持自动故障;线性可伸缩;提供了数据复制;与Hadoop集成,作为源和目标。

优点:为较大的表提供快速查找;提供对来自数十亿条记录的单行的低延迟访问;简单的Java API为客户端;自动分片;License-free;处理HDFS文件存储之上的大型数据集;灵活的模式设计;高速。

缺点:不支持事务;没有权限或内置身份验证;仅按键索引和排序;单点故障(当只使用一个HMaster时);不支持SQL结构;集群上的内存问题。
5. neo4j(Graph)
在这里插入图片描述
Neo4j被称为原生图数据库,因为它有效地实现了属性图模型,一直到存储层。这意味着数据完全按照白板的方式存储,数据库使用指针导航和遍历图。Neo4j有数据库的社区版和企业版。企业版包括Community Edition必须提供的所有功能,以及额外的企业需求,如备份、集群和故障转移功能。

特点:它支持唯一的约束;Neo4j支持完整的ACID(原子性、一致性、隔离性和持久性)规则;Java API: Cypher API和本机Java API;使用Apache Lucence索引;简单查询语言Neo4j CQL;包含用于执行CQL命令的UI: Neo4j Data Browser。

优点:容易检索其相邻节点或关系细节,无需连接或索引;易于学习Neo4j CQL查询语言命令;不需要复杂的连接来检索数据;非常容易地表示半结构化数据;大型企业实时应用程序的高可用性;简化的调优。

缺点:不支持分片。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值