本文的前一个版本由 o.s. Tezer 撰写。

引言

当大多数人想到一个数据库时,他们经常想象传统的关系数据库 / 值模型,包括由行和列组成的表格。 虽然关系数据库管理系统仍然处理互联网上的大部分数据,近年来替代数据模型已经变得越来越普遍,因为开发者已经在寻找解决关系模型的局限性的办法。 这些非关系数据库模型,每个都有自己独特的优点、缺点和用例,已经被归类为 NoSQL 数据库。

本文将向您介绍一些更常用的 NoSQL 数据库模型。 它将权衡它们的一些优点和缺点,并提供数据库管理系统的一些示例和每个系统的潜在用例。

关系数据库及其局限性

数据库是逻辑模型化的信息或数据集群。 同时,数据库管理系统(DBMS)是一个与数据库交互的计算机程序。 Dbms 允许您控制对数据库的访问、编写数据、运行查询以及执行与数据库管理相关的任何其他任务。 尽管数据库管理系统通常被称为“数据库” ,但这两个术语并不完全可以互换。 数据库可以是任何数据的集合,而不仅仅是存储在计算机上的数据,而 DBMS 是允许您与数据库交互的特定软件。

所有数据库管理系统都有一个底层模型,该模型结构化如何存储和访问数据。 关联式资料库管理系统数据库管理系统(RDBMS)是一种采用关系数据模型的数据库管理系统。 在这个模型中,数据被组织成表,在 rdbms 的上下文中,表被更正式地称为关系。 关系数据库数据库管理系统通常使用 SQL 数据库(SQL)来管理和访问数据库中的数据。

历史上,关系模型数据库一直是最广泛使用的数据管理方法,直到今天,许多最流行的数据库管理系统都实现了关系模型数据库。 然而,关系模型提出了一些限制,这些限制在某些用例中可能是有问题的。

例如,很难水平地缩放一个关系数据库。 水平扩展(即向外扩展)是将更多的计算机添加到现有的堆栈中,以便分散负载并允许更多的流量和更快的处理。 这通常与垂直扩展形成对比,垂直扩展需要升级现有服务器的硬件,通常需要增加更多的 RAM 或 CPU。

难以横向扩展关系数据库数据库的原因在于,关系模型数据库的设计是为了确保一致性,这意味着查询相同数据库的客户总是能看到最新的数据。 如果你要在多台机器上横向扩展一个关系数据库,那么很难保证一致性,因为客户机可能只向一个节点写入数据,而不向其他节点写入数据,而且在初始写入和更新其他节点以反映更改的时间之间可能存在延迟。

关系数据库管理系统的另一个缺陷是,关系模型数据库被设计用于管理结构化数据,或者与预定义数据类型相一致的数据,或者至少以某种预定的方式进行组织,使其易于分类和搜索。 然而,随着20世纪90年代初个人电脑的普及和互联网的兴起,电子邮件、照片、视频等非结构化数据变得越来越普遍。

随着这些限制越来越严格,开发人员开始寻找传统关系数据模型的替代品,导致 NoSQL 数据库越来越受欢迎。

关于 NoSQL

标签 NoSQL 本身有一个相当模糊的定义。 “ NoSQL”是 Carlo Strozzi 在1998年发明的,他当时新建的 NoSQL 数据库的名字,选择这个名字仅仅是因为它不使用 SQL 来管理数据。

2009年,Johan Oskarsson 组织了一次开发者见面会,讨论像 Cassandra 和 Voldemort 这样的“开源、分布式和非关系型数据库”的传播。 Oskarsson 将这个聚会命名为“ NOSQL” ,从那时起,这个词就被用作任何没有使用关系模型数据库的数据库的一个包罗万象的术语。 有趣的是,Strozzi 的 NoSQL 数据库实际上使用了 NoSQL 关系模型,这意味着最初的 NoSQL 数据库不符合 NoSQL 的当代定义。

因为“ NoSQL”通常指的是任何不使用关系模型数据库的数据库管理系统,所以有几个操作数据模型与 NoSQL 概念相关联。 下表包括若干此类数据模型,但请注意,这并不是一个全面的清单:

Operational Database Model Example DBMSs
Key-value store Redis, MemcacheDB
Columnar database Cassandra, Apache HBase
Document store MongoDB, Couchbase
Graph database OrientDB, Neo4j

尽管有这些不同的底层数据模型,大多数 NoSQL 数据库都具有几个共同的特征。 首先,NoSQL 数据库通常被设计为以牺牲一致性为代价来最大化可用性。 从这个意义上说,一致性是指任何读操作都将返回写入数据库的最新数据。 在为强一致性而设计的分布式数据库中,写入一个节点的任何数据都会立即在所有其他节点上可用; 否则,就会发生错误。

相反,NoSQL 数据库通常以最终一致性为目标。 这意味着新写入的数据最终在数据库中的其他节点上可用(通常在几毫秒内) ,但不一定是立即可用。 这样做的好处是可以提高数据的可用性: 即使您可能看不到写入的最新数据,您仍然可以查看它的早期版本,而不是接收错误。

关系数据库被设计用来处理规范化数据,这些数据完全符合预定义的模式。 在数据库管理系统的上下文中,规范化数据是以消除冗余的方式组织的数据,这意味着数据库占用尽可能少的存储空间,而模式是数据库中数据结构的概述。

数据库具备处理规范化数据的能力,能够按照预定义的模式对数据进行排序,但它们各自的数据模型通常比关系数据库强加的严格结构具有更大的灵活性。 正因为如此,NoSQL 数据库被认为是存储半结构化和非结构化数据的更好选择。 考虑到这一点,因为 NoSQL 数据库没有预先定义的模式,这通常意味着需要由数据库管理员来定义数据应该如何组织和访问,无论以何种方式对其应用程序最有意义。

现在您已经了解了 NoSQL 数据库是什么以及它们与关系数据库的不同之处,接下来让我们进一步了解一些更广泛实现的 NoSQL 数据库模型。

键值数据库

键值数据库,也称为键值存储,通过存储和管理关联数组来工作。 一个关联数组,也称为字典或散列表,由一组键值对组成,其中一个键作为一个唯一标识符来检索一个关联的值。 值可以是任何东西,从简单对象(如整数或字符串)到更复杂的对象(如 JSON 结构)。

与关系数据库不同,关系数据库定义的数据结构由具有预定义数据类型的行和列表组成,键值数据库将数据存储为单个集合,没有任何结构或关系。 在连接到数据库服务器之后,应用程序可以定义一个密钥(例如,生命的意义) ,并提供一个匹配值(例如,42) ,以后可以通过提供密钥以相同的方式检索该值。 键值数据库将其中保存的任何数据视为不透明的 blob; 应用程序需要理解它的结构。

键值数据库通常被描述为具有高性能、高效率和可伸缩性。 键值数据库的常见用例有缓存、消息队列和会话管理。

一些流行的开源键值数据存储包括:

Database Description
Redis An in-memory data store used as a database, cache, or message broker, Redis supports a variety of data structures, ranging from strings to bitmaps, streams, and spatial indexes.
Memcached A general-purpose memory object caching system frequently used to speed up data-driven websites and applications by caching data and objects in memory.
Riak A distributed key-value database with advanced local and multi-cluster replication.

柱状数据库

柱状数据库,有时称为面向列的数据库,是以列形式存储数据的数据库系统。 这可能看起来与传统的关系数据库相似,但是不是将列分组到表中,而是将每个列存储在系统存储中的一个单独的文件或区域中。

存储在柱状数据库中的数据按记录顺序出现,这意味着一列中的第一个条目与其他列中的第一个条目相关。 这种设计允许查询只读取它们需要的列,而不必读取表中的每一行,并在不需要的数据被存储在内存中后丢弃它们。

因为每列中的数据都是相同的类型,所以它允许不同的存储和读优化策略。 特别是,许多分栏式数据库管理员实现了一种压缩策略,比如游程编码分析,以最小化单个列占用的空间量。 这样做的好处是可以加快读取速度,因为查询需要遍历更少的行。 但是,柱状数据库的一个缺点是,加载性能往往很慢,因为每一列都必须单独编写,而且数据经常被压缩。 特别是增量负载,以及单个记录的读取,在性能方面可能会很昂贵。

面向列的数据库从20世纪60年代就已经存在了。 不过,自2000年代中期以来,柱状数据库在数据分析方面得到了更广泛的应用,因为柱状数据模型非常适合于快速查询处理。 在应用程序需要频繁执行聚合函数的情况下,比如在一列中查找数据的平均值或总和时,它们也被视为具有优势。 一些列式数据库管理系统甚至能够使用 SQL 查询。

一些流行的开源专栏数据库如下:

Database Description
Apache Cassandra A column store designed to maximize scalability, availability, and performance.
Apache HBase A distributed database that supports structured storage for large amounts of data and is designed to work with the Hadoop software library.
ClickHouse A fault tolerant DBMS that supports real time generation of analytical data and SQL queries.

面向文件的数据库

面向文档的数据库或文档存储是以文档形式存储数据的 NoSQL 数据库。 文档存储是键值存储的一种类型: 每个文档都有一个唯一标识符 / 键(key) ,文档本身充当值。

这两种模型的区别在于,在键值数据库中,数据被视为不透明的,数据库不知道或不关心其中保存的数据; 应用程序需要理解存储了哪些数据。 但是,在文档存储中,每个文档都包含某种类型的元数据,这些元数据为数据提供了一定程度的结构。 文档存储通常附带一个 API 或查询语言,允许用户根据文档包含的元数据检索文档。 它们还允许复杂的数据结构,因为您可以在其他文档中嵌套文档。

与关系数据库不同的是,面向文档的数据库可以将给定对象的所有数据存储在一个文档中。 文档存储通常以 JSON、 BSON、 XML 或 YAML 文档的形式存储数据,有些存储可以存储二进制格式,如 PDF 文档。 有些使用 SQL 的变体、全文搜索或自己的本地查询语言进行数据检索,还有一些使用多种查询方法。

近年来,面向文档的数据库越来越受欢迎。 由于其灵活的模式,他们已经在电子商务、博客、分析平台以及内容管理系统中找到了常规应用。 文档存储被认为是高度可伸缩的,切分是一种常见的水平伸缩策略。 它们还能很好地保存大量不相关的、复杂的、结构各异的信息。

一些流行的基于开源文档的数据存储包括:

Database Description
MongoDB A general purpose, distributed document store, MongoDB is the world’s most widely used document-oriented database at the time of this writing.
Couchbase Originally known as Membase, a JSON-based, Memcached-compatible document-based data store. A multi-model database, Couchbase can also function as a key-value store.
Apache CouchDB A project of the Apache Software Foundation, CouchDB stores data as JSON documents and uses JavaScript as its query language.

图形数据库

图形数据库可以被认为是文档存储模型的子类别,因为它们将数据存储在文档中,并且不坚持数据遵循预定义的模式。 不过,区别在于图形数据库通过突出显示单个文档之间的关系,为文档模型增加了额外的一层。

为了更好地掌握图形数据库的概念,理解以下术语非常重要:

  • 节点: 节点是由图形数据库跟踪的单个实体的表示形式。 它或多或少等同于关系数据库文档或文档存储中的记录或行的概念。 例如,在音乐录制艺术家的图形数据库中,节点可以表示单个演奏者或乐队。
  • 属性: 属性是与单个节点相关的信息。 基于我们的录音艺术家示例,一些属性可能是“ vocalist”、“ jazz”或“ platinum-selling artist” ,这取决于与数据库相关的信息。
  • 边: 也称为图或关系,边是两个节点如何相关的表示,是图数据库的关键概念,将它们与 rdbms 和文档存储区区分开来。 边缘可以是有向的或无向的。 无向图: 在无向图中,节点之间的边存在只是为了显示它们之间的联系。 在这种情况下,边可以被认为是“双向”关系ーー在一个节点与另一个节点之间没有隐含的区别。 有向图: 在有向图中,根据关系起源的方向,边可以有不同的含义。 在这种情况下,边是“单向”关系。 例如,一个有向图数据库可能会指定一个关系,从 Sammy 到海藻,显示 Sammy 为这个团队制作了一个专辑,但是可能不会显示一个等价的关系,从海藻到 Sammy。

使用图形数据库执行某些操作要简单得多,因为它们链接和分组相关的信息。 这些数据库通常用于能够从数据点之间的关系中获得洞察力的情况,或者在终端用户可用的信息是由他们与其他人的连接决定的应用程序中,比如在社交网络中。 他们已经在欺诈检测、推荐引擎、身份和访问管理应用程序中找到了常规应用。

一些流行的开源图形数据库如下:

Database Description
Neo4j An ACID-compliant DBMS with native graph storage and processing. As of this writing, Neo4j is the most popular graph database in the world.
ArangoDB Not exclusively a graph database, ArangoDB is a multi-model database that unites the graph, document, and key-value data models in one DBMS. It features AQL (a native SQL-like query language), full-text search, and a ranking engine.
OrientDB Another multi-model database, OrientDB supports the graph, document, key-value, and object models. It supports SQL queries and ACID transactions.

总结

在本教程中,我们只介绍了目前使用的几种 NoSQL 数据模型。 一些 NoSQL 模型,比如对象存储,在过去的几年中已经看到了不同程度的使用,但是在某些情况下仍然是关系模型的可行替代品。 另一些数据库,如对象关系数据库和时间序列数据库,将关系数据模型和 NoSQL 数据模型的元素混合在一起,形成一种介于两个极端之间的中间地带。

数据库的 NoSQL 类别非常广泛,并且持续发展到今天。 如果您有兴趣学习更多关于 NoSQL 数据库管理系统和概念的知识,我们鼓励您查看我们的 NoSQL 相关内容库。