Nosql的存储模式

234 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

首先我们了解一下键值存储实现原理:

学过Java基础后我们知道键值对即key-value模式,在键值对数据库里面放宽了对值内容的限制,只保证key的唯一性,value不限制,可以是字符串,数字,图片,视频等。

  • ⚠️ 注意:这个 key 和 value 一定是成对出现的,缺少一个都不行。
  • ⚠️ 注意:键不是越长越好(一般不要超过 1024 个字节),键的内容越多,内存开销就越大,从而会降低查询效率;键的内容太短也不好,可读性不高;在同一类数据集合中,键的命名规范最好统一。
  • ⚠️ 注意:键值模式的 NoSQL 数据库通常不支持对值建立索引。不同的键值数据库对值会有不同的约束,特别是在值存储的大小上(甚至是不同数据对象的约束都不一样)。

对数据操作的几个常用命令:

  • put(set) 命令:用于写或者更新键值存储里指定地址的值(当指定了地址值,此时若更新值时,没有值就会新增一个值)。
  • get 命令:用于读取键值存储里指定地址的值。
  • delete 命令:用于删除键值存储指定地址的键和值。

键值模式的优缺点

优点:

  • 简单:数据存储结构只有键和值,不用预先定义数据类型,值理论上可以存储任意数据。
  • 快速:以内存为主的设计思路使他拥有了快速处理数据的能力。
  • 高效:数据结构简单化,数据之间没有关联关系,在大量用户访问下,可以快速响应用户的请求。
  • 分布式处理:具备了处理大数据的能力

缺点:

  • 一般不提供对值的直接查找:键值数据库设计之初就以键为主要对象进行各种数据操作,对值直接进行操作的功能很弱。
  • 缺少约束,容易出错:原则上值里什么数据都可以存放,甚至放错了都不会报错。
  • 不容易建立复杂关系:键值数据库局限于两个数据集之间的有限计算,比如 Redis 数据库里的交、并、补集运算。

文档存储的实现

文档数据库旨在将半结构化数据存储为文档的一种数据库。文档数据库可以存放或获取文档,可以支持多种文档格式,文档数据库中存放的文档,就相当于键值数据库所存放的“值”。

  • ⚠️ 注意:文档存储模式和键值存储模式有相似性,文档存储其值是半结构化内容,可以通过关键词查找文档内部的结构和内容,而非只通过键来进行检索

文档存储特点

功能特点:

  • 面向集合存储,易存储对象类型的数据
  • 支持动态查询
  • 支持完全索引,包含内部对象
  • 支持复制和故障恢复等等

那这个文档存储与我们前面的键值存储有啥区别呢?

实际上文档存储和键值存储很相似,它们之间不同的是:键值存储很少直接对 value 进行操作,一般都是直接操作 key;而文档存储关心的是文档的内部结构,这使存储引擎可以直接支持二级索引,从而允许对任意字段进行高效查询。

文档存储优缺点

优点:

  • 内容集中,简化关系:所有的内容都在一个数据库中,信息不分散在多个链接数据库中。相比较 SQL 数据库,简化了数据之间复杂的关系。
  • 灵活,支持全文检索:文档存储数据库可以没有任何内容,不需要文档有一致性,可以存储大量的数据。可以允许对任意字段进行高效查询。

缺点:

  • 数据丢失:可能会由于缺乏熟悉性而导致配置错误,又或者由于使用单个节点,这些都有可能导致数据丢失。
  • 限制复杂查询:文档存储数据库其实不太适合运行多个复杂的操作或复杂的查询。

列族存储

列是列族数据库的基本存储单元,若干个列可以构成一个行,各行之间可以具备相同的列,也可以具备不同的列。如果列的数量比较多,最好把相关的列分成组,这些由列构成的组就叫做列族(column family)

列族数据库将数据存储在列族中,而列族中的行把许多列数据与本行的“行键”(row key)管理起来(这里的列族可以看作关系型数据库中的表(table) )。

  • ⚠️ 注意:关系型数据库中列(column) ,每行所对应的各列均相同;列族数据库中的列(column) ,不同的行所对应的列可以有差别。

功能特征:

  • 按列存储数据
  • 方便存储结构化和半结构化数据
  • 方便进行数据压缩
  • 对某一列或某几列的查询有着极大的 IO 优势

列族数据库一般适用于那种需要部署在大规模数据库的场合,在那种场合中所使用的数据库需要具备较高的写入性能,并且要能再大量的服务器及多个数据中心上面运作。

列族存储与我们前面学习的键值存储有啥异同

相同点:它们都是键值存储的;

区别:列族数据库中的值是根据标识符,列名以及时间戳来进行索引的;而键值数据库则是根据健来进行索引。

列族查询优缺点

优点:

  • 可扩展性:它能够根据数据库的规模分布在百台不同的机器上,支持大规模并行处理。
  • 方便压缩:擅长压缩数据,从而节省存储空间。
  • 反应灵敏:加载时间短,查询执行速度快。

缺点:

  • 不擅长更新事务处理:对于在线事务处理,这些数据库不是很高效。
  • 特定行的查询会影响性能:对于特定行的查询,需要引入额外的步骤,即扫描列以识别行,然后定位要检索的数据。访问分散在多列中的单个记录需要很多时间,而访问单个列中的分组记录会更快。频繁的行特定查询可能会降低列式数据库的速度,从而导致性能问题。

图存储

图形数据库是以图论为基础的,用图来表示一个对象集合,包括顶点和连接顶点的边(比如有向图、无向图、加权图、二分图等等)。一幅简单的图形是由一系列结点边线所构成。实际开发中,图型数据库会赋予结点与连线更多类别与属性,以使其更具有可描述性及实际应用功能。

  • ⚠️ 注意:图数据库就是由顶点组成的。图数据库并非指存储图片的数据库,而是以这种数据结构存储和查询数据。

主要有以下功能特征:

  • 支持高性能
  • 支持分布式部署
  • 支持快速遍历

随着社交、电商、金融、零售、物联网等行业的快速发展,大数据行业需要处理的数据之间的关系随数据量呈几何级数增长,急需一种支持海量复杂数据关系运算的数据库,而图数据库就能够解决这样的问题。现在各行各业基本都有使用图数据库,比如:社交领域、零售领域、金融领域、电信领域、旅游领域等等。

特点

特点么?

👨‍🏫:当然可以。图数据库有以下特点:

  • 图数据库由顶点和边组成
  • 图数据库中顶点都是实体,边则表示关联
  • 顶点和边都可以带多个属性,其中边的一种重要属性是权值
  • 边分为有向边和无向边
  • 路径表示两个顶点之间的一条通路
  • 图数据库一般运行在一台服务器上,需要垂直扩展