nosql介绍

关系型数据库存在的弱点

不容易扩展(增加一列或者是提高性能都需要很大的成本)

列式数据库

是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理和即时查询。

相应代表(HBase, BigTable)

列式数据库特点

  • 高效的储存空间利用率
列用字典表等结构
  • 查询效率高
读取多条数据的同一列效率高,因为这些列都是存储在一起的,一次磁盘操作可以数据的指定列全部读取到内存中。
  • 适合做聚合操作
因为按照的是列来存储
  • 适合大量数据而不是小数据
由于字典也需要占用一定空间,数据量越大,空间利用越高

缺点:

1.不适合扫描 小量数据


2.不适合 随机的更新


3.不适合做含有删除和更新的 实时操作


4.单行数据 支持 ACID 的 事务操作,多行数据 的 事务操作,不支持事务的 正常回滚,支持 (Isolation)隔离性、(Durability)持久性,不能保证 (Atomicity)原子性、(Consistency)一致性。

应用场景

1.适合 大数据量 (100TB 级数据),有 快速随机访问 的需求。


2.适合 写密集型 应用,每天写入量巨大,而 读数量相对较小 的应用,比如 IM 的 历史消息,游戏日志 等等。


3.适合不需要 复杂查询 条件来查询数据的应用。HBase 只支持基于 rowkey 的查询,对于 HBase 来说,单条记录 或者 小范围的查询 是可以接受的。大范围 的查询由于 分布式 的原因,可能在 性能 上有点影响。HBase 不适用于有 join,多级索引,表关系复杂 的数据模型。


4.对 性能 和 可靠性 要求非常高的应用。
由于 HBase 本身没有 单点故障,可用性 非常高。


5.适合 数据量较大,而且 增长量 无法预估的应用,需要进行优雅的数据扩展的应用。HBase 支持 在线扩展,即使在一段时间内,数据量呈 井喷式增长,也可以通过 HBase 横向扩展 来满足功能。


6.存储 结构化 和 半结构化 的数据。

K-V数据库

指的是使用 键值(key-value)存储的数据库,其数据按照 键值对 的形式进行 组织、索引 和 存储。
KV 存储非常适合不涉及过多 数据关系 业务的数据。它能够有效减少 读写磁盘 的次数,比 SQL 数据库存储 拥有更好的 读写性能,能够解决 关系型数据库 无法存储 数据结构 的问题。

代表:redis,Cassandra,Memcached,LevelDB

特点(Redis为例)

优点
  • 性能极高
Redis 单机最高能支持超过 10W 的 TPS
  • 丰富的数据类型
Redis 支持包括 String,Hash,List,Set,Sorted Set,Bitmap 和 Hyperloglog 等数据结构。
  • 丰富的特性
Redis 还支持 publish/subscribe,通知,key 过期 等特性。

具体应用场景

适合:  存储用户信息、配置文件、参数、购物车等

不适合: 通过值来查询, 需要存储数据之间的关系,没有事物要求

缺点

  • Redis 事务 不能支持 原子性 和 持久性(A 和 D),只支持 隔离性 和 一致性(I 和 C)。

文档数据库

文档数据库 用于将 半结构化数据 存储为 文档 的一种数据库。文档数据库通常以 JSON 或 XML 格式存储数据。

由于文档数据库的 no-schema 特性,可以 存储 和 读取 任意数据。

由于使用的 数据格式 是 JSON 或者 BSON,因为 JSON 数据是 自描述的,无需在使用前定义字段,读取一个 JSON 中 不存在的字段 也不会导致 SQL 那样的语法错误,可以解决关系型数据库 表结构 schema 扩展不方便 的问题。

代表(MongoDB、CouchDB)

特点(MongoDB为例)

优点
  • 新增字段简单不需要像关系型数据库一样,先执行 DDL 语句 修改表结构,程序代码 直接读写 即可。

  • 容易兼容 历史数据。对于历史数据,即使没有新增的字段,也不会导致错误,只会返回 空值,此时 代码兼容处理 即可。

  • 容易存储复杂数据。JSON 是一种强大的 描述语言,能够描述复杂的 数据结构。

缺点

多条数据记录 的 事务支持较弱,具体体现如下:

  • Atomicity(原子性):仅支持 单行/文档级原子性,不支持 多行、多文档、多语句原子性。

  • Isolation(隔离性):隔离级别仅支持 已提交读(Read committed)级别,可能导致 不可重复读,幻读 的问题。

  • 不支持 复杂查询。例如 join 查询,如果需要 join 查询,需要 多次操作数据库。

应用场景

适用
  • 数据量 很大或者未来会变得很大。

  • 表结构不明确,且 字段 在 不断增加,例如内容管理系统,信息管理系统。

不适用
  • 在不同的文档上需要添加 事务。Document-Oriented 数据库并不支持 文档间的事务。

  • 多个文档之间需要 复杂的查询,例如 join 操作。

全文搜索数据库

传统关系型数据库,主要通过 索引 来达到 快速查询 的目的。在 全文搜索 的业务下,索引 也无能为力,主要体现在以下几方面:

全文搜索的条件,可以随意 排列组合,如果通过索引来满足,则索引的 数量非常多。

全文搜索的 模糊匹配方式,索引 无法满足,只能用 like 进行查询,而 like 查询是 整表扫描,效率非常低。

全文搜索引擎 的技术原理称为 倒排索引(inverted index),是一种 索引方法,其基本原理是建立 单词 到 文档 的索引。与之相对是,是 正排索引,其基本原理是建立 文档 到 单词 的索引

代表(ElasticSearch,Solr)

特点

优点
  • 查询效率高,适用于对 海量数据 进行 近实时 的处理。

  • 可扩展性

  • 基于 集群 环境可以方便 横向扩展,可以承载 PB 级的数据。

  • 支持 高可用,ElasticSearch 集群弹性灵活,可以发现新的或失败的节点,重组 和 重新平衡 数据,确保数据是 安全 和 可访问的。

缺点
  • 事务的 ACID 支持不足,单一文档 的数据是支持 ACID 的。对于 多个文档 的 事务操作,不支持事务的 正常回滚。支持(Isolation)隔离性(基于 乐观锁机制)和(Durability)持久性,不支持(Atomicity)原子性,(Consistency)一致性。
  • 对类似数据库中,通过 外键 进行 多表关联的复杂操作支持较弱。
  • 读写 有一定 延时,写入的数据,最快 1s 中能被检索到。
  • 更新 性能较低,底层实现是 先删数据,再 插入新数据。
  • 内存占用大,因为 Lucene 将 索引部分 加载到 内存 中。

应用场景

适用
  • 分布式的 搜索引擎 和 数据分析引擎。
  • 全文检索,结构化检索 以及 数据分析。
  • 对海量数据进行 近实时 的处理,可以将 海量数据 分散到 多台服务器 上去 存储 和 检索。
不适用
  • 数据需要 频繁更新。

  • 需要 复杂关联查询。

图形数据库

图形数据库 应用 图形理论 存储 实体 之间的 关系信息。最常见例子就是 社会网络中人与人之间的关系。关系型数据库 用于存储这种 关系型数据 的效果并不好,其查询 复杂、缓慢、超出预期。

图形数据库 的独特设计弥补了这个缺陷,解决 关系型 数据库 存储 和 处理复杂关系型数据 功能较弱的问题。

代表(Neo4j,ArangoDB,)

原理 (以Neo4j为例)

Neo4j 使用 数据结构 中图(graph)的概念来进行 建模。


Neo4j 中两个最基本的概念是 节点 和 边。节点 表示 实体,边 则表示 实体之间的关系。节点 和 边 都可以有自己的 属性。不同 实体 通过各种不同的 关系 关联起来,形成复杂的 对象图。

在 Neo4j 中,存储节点 时使用了 index-free adjacency,即 每个节点 都有指向其 邻居节点 的 指针。这样就可以在 O(1) 的 复杂度 内找到 邻居节点。另外,按照官方的说法,在 Neo4j 中 边 s是最重要的,是 first-class entities,需要 单独存储。这有利于在 图遍历 的时候 提高速度,也可以很方便地以 任何方向 进行遍历。

特点

优点
  • 高性能表现
图的遍历 是 图数据结构 所具有的独特算法,即从 一个节点 开始,根据其连接的 关系,可以快速和方便地找出它的 邻近节点。这种查找数据的方法不受 数据量大小 的影响,因为 邻近查询 始终查找的是 有限的局部数据,不会对 整个数据库 进行搜索。
  • 设计的灵活性
数据结构 的自然伸展特性,以及其 非结构化 的 数据格式,让图数据库设计可以具有很大的 伸缩性 和 灵活性。因为随着需求的变化而增加的 节点、关系 及其 属性,并不会影响到 原来数据 的正常使用。
  • 开发的敏捷性
数据模型 直接明了,从需求的讨论开始,到程序开发和实现,基本上不会有大的变化。
  • 完全支持ACID
不像别的 NoSQL 数据库,Neo4j 还完全具有 事务管理特性,完全支持 ACID 事务管理。
缺点
  • 节点,关系 和它们的 属性 的数量被 限制。

  • 不支持 拆分。

应用场景

适用场景
  • 在一些 关系性强 的数据应用,例如 社交网络。

  • 推荐引擎,将数据以 图的形式 表现,非常有益于推荐的制定。

不适用场景
  • 记录大量 基于事件 的数据,如日志记录、传感器数据。

  • 对大规模 分布式数据 进行处理,类似于 Hadoop。

  • 不适用于应该保存在 关系型数据库 中的 结构化数据。

  • 二进制数据存储。

关于 关系型数据库 和 NoSQL 数据库 的选型,往往需要考虑几个指标:

数据量
并发量
实时性
一致性要求
读写分布
数据类型
安全性
运维成本
企业内部管理系统
例如运营系统,数据量少,并发量小,首选考虑 关系型数据库


互联网大流量系统
例如电商单品页,后台考虑选 关系型数据库,前台考虑选 内存型数据库


日志型系统
原始数据 考虑选 列式数据库,日志搜索 考虑选 倒排索引


搜索型系统
例如站内搜索,非通用搜索,商品搜索,后台考虑选 关系型数据库,前台考虑选 倒排索引


事务型系统
例如库存管理,交易,记账,考虑选 关系型数据库 + 缓存数据库 + 一致性型协议


离线计算
例如大量数据分析,考虑选 列式数据库 或者 关系型数据库 都可以


实时计算
例如实时监控,可以考虑选 内存型数据库 或者 列式数据库

参考自

作者:零壹技术栈
链接:https://juejin.im/post/6844903666260901896
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。