集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:15023458194  |   联系客服   |
当前位置:主页 > 培训课程 > 大数据 >

成都数据库培训班:几种NoSQL数据库概述

发布者: 成都达内     浏览次数:     发布时间:2019-08-02 09:33:04

关系数据库有强大的SQL功能和ACID的属性。关系型数据库的优点大概有以下...

  

一,关系数据库

  关系数据库有强大的SQL功能和ACID的属性。关系型数据库的优点大概有以下:

  ①可以通过事务来保持数据的一致性,并且,如银行转账可以通过数据库锁来实现

  ②可以进行多表的join连接

  ③20多年的发展历史,比较成熟

  ④可以应用于各种各样的系统中

  但也存在以下几个缺点

  ①关系数据库存储的是行记录,无法存储数据结果。以微博的关注为例,关注的人是一个用户ID列表,通过这个ID去用户表查询,然后进行数据拼接,最后展示。再比如,做一些报表,需要从不同的表,不同的数据库上获取信息,然后拼接。使用关系数据库存储只能将列表拆成多行,然后在查询出来组装,无法直接存储一个列表

  ②关系数据库的schema扩展很不方便。关系数据库的表结构schema是强约束的,如果操作不存在的列会报错,业务变化是扩充列比较麻烦,需要执行DDL

  (data definition language,如 CREATE、ALTER、DROP 等)语句修改,而且修改时可能会长时间锁表(例如,MySQL 可能将表锁住 1 个小时)。

  ③关系数据库在大数据场景下 I/O 较高

  如果对一些大量数据的表进行统计之类的运算,关系数据库的 I/O 会很高,因为即使只针对其中某一列进行运算,关系数据库也会将整行数据从存储设备读入内存。如淘宝天猫双十一的秒杀活动,如果用关系数据库,根本无法实现。

  ④关系数据库的全文搜索功能比较弱

  关系数据库的全文搜索只能使用 like 进行整表扫描匹配,性能非常低,在互联网这种搜索复杂的场景下无法满足业务要求。

  二,Nosql(非关系)数据库

  针对上述问题,分别诞生了不同的 NoSQL 解决方案,这些方案与关系数据库相比,在某些应用场景下表现更好。但世上没有免费的午餐,NoSQL 方案带来的优势,本质上是牺牲 ACID 中的某个或者某几个特性,因此我们不能盲目地迷信 NoSQL 是银弹,而应该将 NoSQL 作为 SQL 的一个有力补充,NoSQL != No SQL,而是 NoSQL = Not Only SQL。

  常见的 NoSQL 方案分为 4 类。

  ①K-V 存储:解决关系数据库无法存储数据结构的问题,以 Redis 为代表。

  ②文档数据库:解决关系数据库强 schema 约束的问题,以 MongoDB 为代表。

  ③列式数据库:解决关系数据库大数据场景下的 I/O 问题,以 HBase 为代表。

  ④全文搜索引擎:解决关系数据库的全文搜索性能问题,以 Elasticsearch 为代表。

  K-V 存储

  K-V 存储的全称是 Key-Value 存储,其中 Key 是数据的标识,和关系数据库中的主键含义一样,Value 就是具体的数据。

  Redis 是 K-V 存储的典型代表,它是一款开源(基于 BSD 许可)的高性能 K-V 缓存和存储系统。Redis 的 Value 是具体的数据结构,包括 string、hash、list、set、sorted set、bitmap 和 hyperloglog,所以常常被称为数据结构服务器。

  以 List 数据结构为例,Redis 提供了下面这些典型的操作(更多请参考链接:http://redis.cn/commands.html#list):

  LPOP key 从队列的左边出队一个元素。

  LINDEX key index 获取一个元素,通过其索引列表。

  LLEN key 获得队列(List)的长度。

  RPOP key 从队列的右边出队一个元素。

  redis的存储限制:

  String类型:一个String类型的value最大可以存储512M

  List类型:list的元素个数最多为2^32-1个,也就是4294967295个。

  Set类型:元素个数最多为2^32-1个,也就是4294967295个。

  Hash类型:键值对个数最多为2^32-1个,也就是4294967295个。

  Sorted set类型:跟Set类型相似。

  以上这些功能,如果用关系数据库来实现,就会变得很复杂。例如,LPOP 操作是移除并返回 key 对应的 list 的第一个元素。如果用关系数据库来存储,为了达到同样目的,需要进行下面的操作:

  每条数据除了数据编号(例如,行 ID),还要有位置编号,否则没有办法判断哪条数据是第一条。注意这里不能用行 ID 作为位置编号,因为我们会往列表头部插入数据。

  a,查询出第一条数据。

  b,删除第一条数据。

  c,更新从第二条开始的所有数据的位置编号。

  可以看出关系数据库的实现很麻烦,而且需要进行多次 SQL 操作,性能很低。

  Redis 的缺点主要体现在并不支持完整的 ACID 事务,Redis 虽然提供事务功能,但 Redis 的事务和关系数据库的事务不可同日而语,Redis 的事务只能保证隔离性和一致性(I 和 C),无法保证原子性和持久性(A 和 D)。

  虽然 Redis 并没有严格遵循 ACID 原则,但实际上大部分业务也不需要严格遵循 ACID 原则。以上面的微博关注操作为例,即使系统没有将 A 加入 B 的粉丝列表,其实业务影响也非常小,因此我们在设计方案时,需要根据业务特性和要求来确定是否可以用 Redis,而不能因为 Redis 不遵循 ACID 原则就直接放弃。

  文档数据库

  为了解决关系数据库 schema 带来的问题,文档数据库应运而生。文档数据库最大的特点就是 no-schema,可以存储和读取任意的数据。目前绝大部分文档数据库存储的数据格式是 JSON(或者 BSON),因为 JSON 数据是自描述的,无须在使用前定义字段,读取一个 JSON 中不存在的字段也不会导致 SQL 那样的语法错误。

  文档数据库的 no-schema 特性,给业务开发带来了几个明显的优势。

  1. 新增字段简单

  业务上增加新的字段,无须再像关系数据库一样要先执行 DDL 语句修改表结构,程序代码直接读写即可。

  2. 历史数据不会出错

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

  3. 可以很容易存储复杂数据

  JSON 是一种强大的描述语言,能够描述复杂的数据结构。例如,我们设计一个用户管理系统,用户的信息有 ID、姓名、性别、爱好、邮箱、地址、学历信息。其中爱好是列表(因为可以有多个爱好);地址是一个结构,包括省市区楼盘地址;学历包括学校、专业、入学毕业年份信息等。如果我们用关系数据库来存储,需要设计多张表,包括基本信息(列:ID、姓名、性别、邮箱)、爱好(列:ID、爱好)、地址(列:省、市、区、详细地址)、学历(列:入学时间、毕业时间、学校名称、专业),而使用文档数据库,一个 JSON 就可以全部描述。

  {

  "id": 10000,

  "name": "James",

  "sex": "male",

  "hobbies": [

  "football",

  "playing",

  "singing"

  ],

  "email": "user@google.com",

  "address": {

  "province": "GuangDong",

  "city": "GuangZhou",

  "district": "Tianhe",

  "detail": "PingYun Road 163"

  },

  "education": [

  {

  "begin": "2000-09-01",

  "end": "2004-07-01",

  "school": "UESTC",

  "major": "Computer Science & Technology"

  },

  {

  "begin": "2004-09-01",

  "end": "2007-07-01",

  "school": "SCUT",

  "major": "Computer Science & Technology"

  }

  ]

  }

  通过这个样例我们看到,使用 JSON 来描述数据,比使用关系型数据库表来描述数据方便和容易得多,而且更加容易理解。

  文档数据库的这个特点,特别适合电商和游戏这类的业务场景。以电商为例,不同商品的属性差异很大。例如,冰箱的属性和笔记本电脑的属性差异非常大,如下图所示。

  

  即使是同类商品也有不同的属性。例如,LCD 和 LED 显示器,两者有不同的参数指标。这种业务场景如果使用关系数据库来存储数据,就会很麻烦,而使用文档数据库,会简单、方便许多,扩展新的属性也更加容易。

  文档数据库 no-schema 的特性带来的这些优势也是有代价的,最主要的代价就是不支持事务。例如,使用 MongoDB 来存储商品库存,系统创建订单的时候首先需要减扣库存,然后再创建订单。这是一个事务操作,用关系数据库来实现就很简单,但如果用 MongoDB 来实现,就无法做到事务性。异常情况下可能出现库存被扣减了,但订单没有创建的情况。因此某些对事务要求严格的业务场景是不能使用文档数据库的。

  文档数据库另外一个缺点就是无法实现关系数据库的 join 操作。例如,我们有一个用户信息表和一个订单表,订单表中有买家用户 id。如果要查询“购买了苹果笔记本用户中的女性用户”,用关系数据库来实现,一个简单的 join 操作就搞定了;而用文档数据库是无法进行 join 查询的,需要查两次:一次查询订单表中购买了苹果笔记本的用户,然后再查询这些用户哪些是女性用户。

  列式数据库

  顾名思义,列式数据库就是按照列来存储数据的数据库,与之对应的传统关系数据库被称为“行式数据库”,因为关系数据库是按照行来存储数据的。

  关系数据库按照行式来存储数据,主要有以下几个优势:

  业务同时读取多个列时效率高,因为这些列都是按行存储在一起的,一次磁盘操作就能够把一行数据中的各个列都读取到内存中。

  能够一次性完成对一行中的多个列的写操作,保证了针对行数据写操作的原子性和一致性;否则如果采用列存储,可能会出现某次写操作,有的列成功了,有的列失败了,导致数据不一致。

  我们可以看到,行式存储的优势是在特定的业务场景下才能体现,如果不存在这样的业务场景,那么行式存储的优势也将不复存在,甚至成为劣势,典型的场景就是海量数据进行统计。例如,计算某个城市体重超重的人员数据,实际上只需要读取每个人的体重这一列并进行统计即可,而行式存储即使最终只使用一列,也会将所有行数据都读取出来。如果单行用户信息有 1KB,其中体重只有 4 个字节,行式存储还是会将整行 1KB 数据全部读取到内存中,这是明显的浪费。而如果采用列式存储,每个用户只需要读取 4 字节的体重数据即可,I/O 将大大减少。

  除了节省 I/O,列式存储还具备更高的存储压缩比,能够节省更多的存储空间。普通的行式数据库一般压缩率在 3:1 到 5:1 左右,而列式数据库的压缩率一般在 8:1 到 30:1 左右,因为单个列的数据相似度相比行来说更高,能够达到更高的压缩率。

  同样,如果场景发生变化,列式存储的优势又会变成劣势。典型的场景是需要频繁地更新多个列。因为列式存储将不同列存储在磁盘上不连续的空间,导致更新多个列时磁盘是随机写操作;而行式存储时同一行多个列都存储在连续的空间,一次磁盘写操作就可以完成,列式存储的随机写效率要远远低于行式存储的写效率。此外,列式存储高压缩率在更新场景下也会成为劣势,因为更新时需要将存储数据解压后更新,然后再压缩,最后写入磁盘。

  版权声明:文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与达内成都数据库培训机构网站联系删除或授权事宜。

(责任编辑:徐老师)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:成都市锦江区东大街紫东楼端35号明宇金融广场19楼1906室

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区奥克斯广场蜀锦路209号一楼商铺

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都锦江区东大街芷泉街229号东方广场C座3楼303

联系电话:15023458194

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼11楼1115号

联系电话:15023458194

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:15023458194

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街芷泉段229号东方广场C座16层

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:四川省成都市武侯区高新科技孵化园9号园区E座7楼

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都市高新区奥克斯广场B座1708

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

2016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56