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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343