Skip to content
快速预览

NoSQL简介

✍️ w 🕒 2023-06-06 08:22:52(4 months ago) 🔗 E.数据库 数据库 NoSQL

非关系型NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。是指非关系型数据库,它不同于传统的关系型数据库,不使用SQL语言进行数据操作,而是使用其他的数据模型和查询语言。

传统的关系型数据库管理系统(RDBMS)使用表格来存储和管理数据

非关系型数据库则使用其他的数据模型,如键值存储、文档存储、列存储、图形数据库等。

非关系型数据库出现,对数据联表的查询需求不是那么强烈 ,也并不需要在数据写入后立刻读取,但对数据的读取和并发写入速度有非常高的要求

这些非关系型数据库通常被设计用于处理大规模、分布式的数据集,具有高可扩展性、高性能、高可用性和灵活性等特点。与传统的关系型数据库相比,非关系型数据库更适合处理非结构化、半结构化和多变的数据,如Web日志、社交媒体数据、传感器数据等。

特点

  1. 可弹性扩展:NoSQL数据库可以通过添加更多的节点来扩展存储和处理能力,从而满足大规模、高并发的数据处理需求。可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。

  2. BASE特性:NoSQL数据库通常采用BASE(Basically Available, Soft state, Eventually consistent)特性,与传统的ACID(Atomicity, Consistency, Isolation, Durability)特性不同。BASE特性强调可用性、柔性状态和最终一致性,允许数据在一定时间内处于不一致的状态,但最终会达到一致状态。

TIP

BASE特性是NoSQL数据库的一种设计理念,与传统的ACID特性不同。ACID特性强调事务的原子性、一致性、隔离性和持久性,要求数据库在任何情况下都保持一致性。而BASE特性则强调可用性、柔性状态和最终一致性,允许数据在一定时间内处于不一致的状态,但最终会达到一致状态。

具体来说,BASE特性包括:

  1. Basically Available:基本可用,即系统在出现故障或部分失效时仍然能够提供基本的服务,而不是完全停止服务。

  2. Soft state:柔性状态,即系统允许数据在一定时间内处于不一致的状态,而不是要求数据始终保持一致性。

  3. Eventually consistent:最终一致性,即系统最终会达到一致状态,但不要求数据在任何时刻都保持一致性。

采用BASE特性的NoSQL数据库可以更好地适应大规模、高并发、分布式的数据处理需求,具有更高的可用性和灵活性。同时,也要求应用程序在设计时考虑到数据的最终一致性,避免出现数据不一致的情况。

  1. 大数据量、高性能:NoSQL数据库通常被设计用于处理大规模、分布式的数据集,具有高可扩展性、高性能和高吞吐量等特点。NoSQL数据库可以通过分布式存储和处理来实现高性能和高可用性。

  2. 灵活的数据模型:NoSQL数据库支持多种数据模型,如键值存储、文档存储、列存储、图形数据库等,可以根据不同的应用场景选择最适合的数据模型。

  3. 高可用:NoSQL数据库通常采用多副本机制和自动故障转移等技术来保证高可用性,即使某个节点出现故障,也可以保证数据的可用性和一致性。

NoSQL 数据库有哪些种类

键值数据库: 键值数据库是一种基于键值对的数据库,它使用简单的键值对结构来存储和访问数据。每个键都是唯一的,而每个键都对应着一个值。这种数据库不需要预先定义表结构,因此非常适合存储大量数据的高访问负载场景,例如日志系统。键值数据库的优点是存储时不采用任何模式,因此非常容易添加数据。

  • 产品:Riak、Redis、Memcached、Amazon’s Dynamo、Project Voldemort

  • 有谁在使用:GitHub (Riak)、BestBuy (Riak)、Twitter (Redis和Memcached)、StackOverFlow (Redis)、 Instagram (Redis)、Youtube (Memcached)、Wikipedia(Memcached)

文档型数据库: 这类数据库满足了海量数据的存储和访问需求,同时对字段要求不严格,可以随意增加、删除、修改字段,且不需要预先定义表结构,它以文档为单位来存储数据。每个文档都是一个自包含的数据单元,可以包含任意数量的键值对。这种数据库不需要预先定义表结构,因此适用于各种网络应用。文档型数据库的主要代表是MongoDB和CouchDB

  • 产品:MongoDB、CouchDB、RavenDB

  • 有谁在使用:SAP (MongoDB)、Codecademy (MongoDB)、Foursquare (MongoDB)、NBC News (RavenDB)

列存储型数据库: 一种基于列的数据库,它以列为单位来存储数据,而不是以行为单位。这种数据库查找速度快,可扩展性强,适合用作分布式文件存储系统。列存储型数据库

  • 产品:Cassandra、HBase

  • 有谁在使用:Ebay (Cassandra)、Instagram (Cassandra)、NASA (Cassandra)、Twitter (Cassandra and HBase)、Facebook (HBase)、Yahoo!(HBase)

图数据库:一种非关系型数据库,它利用“图结构”的相关算法来存储实体之间的关系信息。这种数据库适合用于构建社交网络和推荐系统的关系图谱。图数据库的主要代表是InfoGrid和Neo4J。

  • 产品:Neo4J、Infinite Graph、OrientDB

  • 有谁在使用:Adobe (Neo4J)、Cisco (Neo4J)、T-Mobile (Neo4J)

NoSQL 与 RDB 该怎么选择

RDB数据库是指关系型数据库,它们使用SQL语言进行数据操作,数据以表格的形式存储。RDB数据库通常具有事务支持、数据完整性保证等特点,适合处理需要强一致性和数据完整性的应用场景。RDB数据库的数据模型是关系模型,数据以表格的形式存储,表格由行和列组成。

关系型数据库存在的问题

  1. 网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘 I/O 是一个很大的瓶颈
  2. 网站每天产生的数据量是巨大的,对于关系型数据库来说,在一张包含海量数据的表中查询,效率是非常低的
  3. 在基于web的结构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没有办法像 web server 和 app server 那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。当需要对数据库系统进行升级和扩展时,往往需要停机维护和数据迁移。
  4. 性能欠佳: 在关系型数据库中,导致性能欠佳的最主要原因是多表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询。为了保证数据库的ACID特性,必须尽量按照其要求的范式进行设计,关系型数据库中的表都是存储一个格式化的数据结构。

关系型数据库都会支持的 ACID 特性,也就是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)

TIP

原子性(Atomicity):是指一个事务中的所有操作,要么全部完成、要么全部不完成,不会存在中间的状态。也就是说事务在正常的情况下会执行完成;异常的情况下,比如在执行的过程中如果出现问题,会回滚成最初的状态,而非中间状态。

一致性(Consistency):是指事务从开始执行到结束执行之间的中间状态不会被其他事务看到。

隔离性(Isolation):是指数据库允许多个事务同时对数据进行读写或修改的能力,并且整个过程对各个事务来说是相互隔离的。

持久性(Durability):是指每次事务提交之后都不会丢失

关系型数据库一般遵循三范式设计思想

第一范式(The First Normal Form,1NF):要求对属性的原子性,也就是说要求数据库中的字段需要具备原子性,不能再被拆分。比如,用户表中有字段:用户 ID、用户名、电话;而其中电话又可以分为:家庭电话和移动电话等。因此,此表不符合第一范式,如下图所示:

第二范式(The Second Normal Form,2NF):例如订单详情表有这些字段:订单 ID、产品 ID、产品名称、产品单价、折扣。其中,订单 ID 和产品 ID 为联合主键,但这个表中的产品名称和产品单价两个字段只依赖产品 ID,和订单 ID 就没有任何关系了,因此这个表也不符合第二范式。

我们可以把原来的订单表拆分为订单表和产品表,其中订单表包含:订单 ID、产品 ID、折扣等字段;而产品表包含:产品 ID、产品名称、产品单价等字段。这样就消除了产品名称和产品单价多次重复出现的情况了,从而避免了冗余数据的产生。

第三范式(The Third Normal Form,3NF):想要满足第三范式必须先满足第二范式,第三范式要求所有的非主键字段必须直接依赖主键,且不存在传递依赖的情况。

例如,有一个学生表中包含了:学生 ID、姓名、所在学院 ID、学院电话、学院地址等字段。这个表的所有字段(除去主键字段)都完全依赖唯一的主键字段(学生 ID),所以符合第二范式。但它存在一个问题,学院电话、学院地址依赖非主键字段学院 ID,而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合第三范式。

我们可以把学生表分为两张表,一张是学生表包含了:学生 ID、姓名、所在学院 ID 等字段;另一张为学院表包含了:学院 ID、学院电话、学院地址等字段,这样就满足第三范式的要求了。使用三范式可以避免数据的冗余,而且在更新表操作时,只需要更新单张表就可以了

一个项目并非只选择一种数据库,可以将其拆开设计,将需要 RDB 特性的放到 RDB 中管理,而其它数据放到 NoSQL 中管理。,在选择上可以参考

  1. 数据模型的关联性要求 NoSQL 适合模型关联性比较低的应用。因此:
  • 如果需要多表关联,则更适合用 RDB
  • 如果对象实体关联少,则更适合用 NoSQL 数据库
    • 其中 MongoDB 可以支持复杂度相对高的数据结构,能够将相关联的数据以文档的方式嵌入,从而减少数据之间的关联操作
  1. 数据库的性能要求 如果数据量多切访问速度至关重要,那么使用 NoSQL 数据库可能是比较合适的。NoSQL 数据库能通过数据的分布存储大幅地提供存储性能。

  2. 数据的一致性要求 NoSQL 数据库有一个缺点:其在事务处理与一致性方面无法与 RDB 相提并论。 因此,NoSQL 数据库很难同时满足强一致性与高并发性。如果应用对性能有高要求,则 NoSQL 数据库只能做到数据最终一致。

  3. 数据的可用性要求 考虑到数据不可用可能会造成风险,NoSQL 数据库提供了强大的数据可用性(在一些需要快速反馈信息给使用者的应用中,响应延迟也算某种程度的高可用)。

参考文章

NoSQL 数据库有哪些典型应用

一文打尽,主流 NoSQL 及应用场景详解~

关系型数据和文档型数据库有什么区别

Sql Or NoSql,看完这一篇你就懂了

NoSQL 简介

Released under the MIT License.