NoSQL:这是什么? (第2部分)

以前,我们基于NoSQL数据库的共同特征来定义什么:非关系,水平可伸缩,高可用性,无模式和(通常)开源。 这次,我们将探讨NoSQL数据库附带的权衡,探索CAP定理,并简要概述不同的数据模型。

权衡取舍

就像任何类型的复制一样,要考虑读/写权衡。 更多副本意味着更快的读取*,但是写入速度较慢。 写入速度变慢,因为必须使用新的或更改的信息来更新每个副本,从而增加了开销。 另一方面,读取可以变得更快*,因为只需要读取一个副本。 对于分布式NoSQL数据库,这是正确的,因为客户端仅需要从最近的服务器节点请求信息。 但是更早的那些星号仍然需要解决。 高度关注一致性的NoSQL数据库将从每个副本中提取信息并进行匹配,以确保在请求读取时它们是一致的。 在这种情况下,读和写都比关系数据库慢。

CAP定理

CAP定理背后的想法是,数据库中只能有三种质量中的两种:CA,AP或CP。 传统的关系数据库倾向于支持CA,这意味着它们是A可用且持续的。 但是由于NoSQL数据库是在考虑分发的基础上构建的,因此P artition容忍度变得至关重要。 因此,NoSQL数据库往往被加权为AP或CP:

这并不是说NoSQL数据库无法同时保持一致。 毕竟,高可用性是通过复制实现的,并且是NoSQL数据库的共同特征之一。 确保每个写入更新其他复制并停止读取请求直到达到一致性时才产生一致性。 两者之间的决定发生在网络延迟或等待时间(方程式的分区容限部分)期间。 如果出现网络延迟,数据库是否:

  1. 允许读写,从而确保可用性
  2. 防止读写,从而确保一致性

增强可用性会带来业务问题。 如果在短暂的网络打h期间,两个用户预订了航班的最后一个座位,而飞机却被超额预订了怎么办? 机会可能很小,但是对于拥有数百万用户的网络规模的公司来说,这是一个至关重要的决定。 另一方面,支持一致性意味着用户在网络问题解决之前无法进行更改。 在某些情况下,用户可能不得不重新提交表单,而在其他时候,该网页可能不可用。 对于某些系统,这很有意义,例如对于银行业,但是对于大型在线零售商,这可能会花费数千美元的销售。

那么,哪个值得青睐,可用性或一致性? 这是一个商业决定。 但是,这种权衡对于程序员来说仍然很重要,因为他们的系统必须处理两种情况。 最后,重要的是要认识到,不同的NoSQL数据库供应商实际上在可用性和一致性之间形成了一个频谱,并且决策并非如此黑白。

数据模型(或NoSQL的类别)

我想用NoSQL探索的最后一件事是不同类型的数据模型,人们倾向于使用它们来创建不同类别的NoSQL数据库。 就像之前定义NoSQL的特征一样,关于存在多少类别和它们是什么没有共识。 大多数人倾向于在以下四个方面达成共识:键值,文档,列和图。

只是为了说明复杂性,有人将第五类(混合缓存存储),将一类分为两个(易失性和非易失性键值)或将各类组合在一起(将键值和列放置为一个)。 一个NoSQL供应商可以由不同的人划分为不同的类别。 这些绝不是硬性规则,在这里可以找到更深入的解释。

核心价值

键值数据库是许多对象关系映射算法尝试并模拟的。 本质上,这是键和值的大型哈希图,其中的值是无模式的,这意味着它们可以是字符串,图像,文档等。逻辑上相互关联的键被聚合到存储桶中。 键值数据模型是不同数据模型中最简单的,并且最容易实现。 键值数据库往往是AP。 Riak和DynamoDB是一些示例。

文献

文档数据库存储由JSON或XML制成的文档(JSON是迄今为止最受欢迎的文档)。 文档中的标签就像关系数据库中的列一样,并且由于没有架构,因此可以根据需要将新标签添加到不同的文档中。 这使得文档可以像表示信息一样复杂,同时允许查询和更新文档的某些部分。 最常见的示例是MongoDB和CouchDB。

请注意,文档数据库实际上在外观上与键值相似,只是使用标签而不是唯一键来存储内容。 并且标记值是在JSON文档而不是存储桶中聚合的。

而不是像关系数据库那样将数据分组为行,而是将数据分组为列。 对于行,行中显示的数据在磁盘上在物理上是连续的。 通过使用列并使它们的数据在物理上连续,搜索/索引列将变得更快。 映射其他列的列称为超级列。 一起访问的列和超级列可以分组为列族。 最常见的示例是Cassandra,HBase和Bigtable。

同样,可以将此数据模型与前两个模型进行比较。 列数据库中的每一行都有一个用于标识它的行键。 行键,列和列族与键值数据库中的键和存储桶或文档数据库中的标签和文档相似。 数据汇总到列系列中,而不是文档或存储桶中。

这里的消息? 键值数据库,文档数据库和列数据库可以视为面向聚集数据库的变体。 到目前为止,所有这些数据模型的目标是将一起访问的数据(聚合)放在同一节点上,以减少检索数据所需的网络上的跳动量。 最后一个数据模型非常不同。

图形

图形数据库非常专业。 数据存储在具有属性的节点中,这些属性类似于面向对象编程中的对象。 数据也存储在关系(也称为边)及其属性中。 关系/边组织节点并具有方向。 考虑一下人与人之间的关系图和指示朋友,父母,同事等的绘制箭头。由于图形数据库的结构是如此不同,因此它们必须使用自己的查询语言(换句话说,实际上没有SQL)。 图数据库的目标是避免昂贵的联接,而它们在组织关系方面的灵活性使查找节点之间的模式变得更加容易。 图形数据库用于映射社会关系,公共交通链接,路线图和网络拓扑。 最常见的图形数据库是Neo4j。