本文摘自 Introducing Data Science,我们将向您介绍四大Nosql数据库类型。
有四大Nosql类型:键值存储(key-value store),文件存储(document store),列导向的数据库(Column-Oriented Database)和图形数据库(graph database)。每种类型都解决了传统关系数据库无法解决的问题。实际的实现往往是这些组合的组合。例如,结合Nosql类型,Orientdb是一个多模式的数据库。Orientdb是图形数据库,每个节点都是一个文档。
在进入不同的Nosql数据库之前,让我们看看与关系数据库之间的比较。传统关系数据库正在努力的走向规范化:确保每一个数据都只存储一次。正规化标志着他们的结构设置。举个例子来说,如果你想把一个人和他的爱好存储为数据,那么你就可以建两个表:一个表存储为人,一个表存储他们的爱好。如图1所示,一个附加的表是必要的,因为他们存在着很多关系:一个人可以有多个爱好,然而一个爱好也可以有很多人喜欢。
一个全面的关系数据库可以由许多实体和联系表。现在让我们看看Nosql不同的类型的数据库之间的比较。
Column databases store列存储数据库
行数据库实际上就是传统的关系数据库,每一行有一行id,并在一个表中存储的行中的每个字段。假设,关于爱好,没有额外的表来存储并且你只有一个表来描述人,如图2所示。注意,在这种情况下,你有轻微的反规范化,因为爱好是可以重复的。如果爱好这个信息是一个额外的信息,但在你使用时并不是必不可少的,添加它作为一个列表内的爱好列是可以接受的方法。但是如果这些信息对一个单独的表来说是不够的,它应该被存储在所有的?
每次你在行存据库中寻找某个数据,进行每行扫描,不管你需要哪列。假设你只需要生日在9月的列表。数据库将在表中从上到下和从左到右扫描所有数据,如图3所示,最终返回生日列表。
索引数据在某些列可以显著提高查询速度,但索引每一列带来额外的开销和数据库仍然是扫描所有列。
Column databases store分别存储每一列,允许更快的扫描时,只涉及一小部分列。见图4。
这个布局看起来很像一个以行为导向的数据库,每一列都有一个索引。一个数据库索引是一种数据结构,允许在存储空间上快速查找数据和额外的写(索引更新)。索引映射到数据的行数,而一个列数据库将数据映射到行数,这样计算变得更快,所以很容易看到有多少人喜欢射箭。例如,单独存储的列也可以优化压缩,因为只有一个数据类型的表。
那么,何时该使用Row-Oriented Database和Column-Oriented Database呢?在Column-Oriented Database中,很容易添加另一个列,因为不受它的影响。但添加整个完整记录需要调整所有的表。这使得Row-Oriented Database更好于Column-Oriented Database在联机事务处理(OLTP)方面,因为他可以不断地添加或更改记录。
Column-Oriented Database在执行分析和报告时的表现: 求和值和计算条目。Row-Oriented Database通常是实际交易的操作数据库(如销售)。夜间批处理作业将用于数据库更新,支持客户快速查找和聚合使用MapReduce算法报告。例如column-family stores are Apache HBase、Facebook的Cassandra、Hypertable和the grandfather of wide-column stores、谷歌的 BigTable。
KEY-VALUE STORES 键值存储
键值存储是最复杂的Nosql数据库。顾名思义,键值对的集合,如图5所示,这种简单性使得他们成为最可伸缩的Nosql数据库类型,能够存储大量的数据。
键值存储的值可以是任何东西:一个字符串,一个数字,而且也是一个新的键值对封装在一个对象。如图6显示了一个稍微复杂键值结构。关键值存储的例子有Redis、Voldemort、Riak和Amazon’s Dynamo。
{"internal data":[{"entities":[
{"customer":[
{"id:1,"name":"Freddy"},{"id:2,"name":"Fritz"}
}],{"legal entities":[
{"id":1,"company":"Maiton"}
]}]
},{"Products":[
{"furniture":[
{"id" :1,"name":"Octopus Table","stock":1}
]
}]}]}
DOCUMENT STORES 文档存储
文档存储是键值存储的复杂性的一个步骤:一个文档存储库确实假定一个特定的文档结构,可以用一个模式来指定。文档存储出现最自然的Nosql数据库类型中,因为它们用于存储日常文档,并且他们允许复杂的查询和计算,这往往已经成为聚合形式的数据。在关系数据库中存储的方式是从一个正常化的角度来看,所有的一切都应该存储一次,并通过外键连接。文件存储的关心小的正常化,只要数据是在一个结构是有意义的。关系数据模型并不总是适合某些业务案例。
报纸或杂志,例如,包含文章。要把这些存储在关系数据库中,首先要把它们切碎:这篇文章正文在一个表中,作者和作者所有的信息,以及在一个网站上发表的文章的评论。如图7所示,报纸上一篇文章也可以存储为一个单一的实体,这降低了对于习惯看到文章内容所消耗的时间。文档存储以MongoDB和CouchDB为例子。
GRAPH DATABASES 图数据库
最后一个大的Nosql数据库类型是最复杂的一个,为了高效地存储实体之间的关系。数据是高度互联的,如社会网络,科学论文引用,或资本资产集群,图形数据库的答案。图或网络数据主要有2个组成部分:
节点:实体本身。在社交网络中,这可能是人。
边:实体间的关系。这种关系用一条线来表示,并且有它自己的特性。边可以有一个方向,例如,如果箭头表示谁是谁的老板。
图可以变的非常复杂来给定足够的关系和实体类型。图8已经表明了复杂性,只有有限数量的实体。图数据库像Neo4j还声称坚持ACID,而文档存储和键值存储坚持BASE。
这个可能性是无限的,因为世界正变得越来越互联,Graph databases可能会赢过其他类型的数据库,包括如今仍然占主导地位的关系数据库。排名最受欢迎的数据库和他们是如何进展可以点击:最新数据库排名
原文链接:https://www.f2er.com/nosql/203721.html