当前位置: 首页 > news >正文

数据库 -- SQL 和 NoSQL 的区别

SQL 和 NoSQL 的区别

 

一、概念

  SQL (Structured Query Language) 数据库,指关系型数据库。主要代表:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源)。
  NoSQL(Not Only SQL)泛指非关系型数据库。主要代表:MongoDB,Redis,CouchDB。
 

二、区别

1、存储方式

   SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档、哈希表或者其他方式。SQL通常以数据库表形式存储数据。举个栗子,存个学生借书数据:
而NoSQL存储方式比较灵活,比如使用类JSON文件存储上表中熊大的借阅数据:
 

2、表/数据集合的数据的关系

   在SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key),索引(index),触发器(trigger),存储过程(stored procedure)等。 表结构可以在被定义之后更新,但是如果有比较大的结构变更的话就会变得比较复杂。在NoSQL中,数据可以在任何时候任何地方添加,不需要先定义表。例如下面这段代码会自动创建一个新的"借阅表"数据集合:
NoSQL也可以在数据集中建立索引。以MongoDB为例,会自动在数据集合创建后创建唯一值_id字段,这样的话就可以在数据集创建后增加索引。
从这点来看,NoSQL可能更加适合初始化数据还不明确或者未定的项目中。
 

3、外部数据存储

   SQL中如何需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部数据表。例如需要在借阅表中增加审核人信息,先建立一个审核人表:
再在原来的借阅人表中增加审核人外键:
这样如果我们需要更新审核人个人信息的时候只需要更新审核人表而不需要对借阅人表做更新。而 在NoSQL中除了这种规范化的外部数据表做法以外,我们还能用如下的非规范化方式把外部数据直接放到原数据集中,以提高查询效率。缺点也比较明显,更新审核人数据的时候将会比较麻烦。
 

4、SQL中的JOIN查询

   SQL中可以使用JOIN表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。NoSQL暂未提供类似JOIN的查询方式对多个数据集中的数据做查询。所以大部分NoSQL使用非规范化的数据存储方式存储数据。
 

5、数据耦合性

   SQL中不允许删除已经被使用的外部数据,例如审核人表中的"熊三"已经被分配给了借阅人熊大,那么在审核人表中将不允许删除熊三这条数据, 以保证数据完整性。而NoSQL中则没有这种强耦合的概念,可以随时删除任何数据。
 

6、事务

   SQL中如果多张表数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成功。这种场景可以通过事务来控制,可以在所有命令完成后再统一提交事务。 而NoSQL中没有事务这个概念,每一个数据集的操作都是原子级的。
 

7、增删改查语法

 

8、查询性能

  在相同水平的系统设计的前提下,因为NoSQL中省略了JOIN查询的消耗,故理论上性能上是优于SQL的。
 
 

三、补充

  目前许多大型互联网项目都会选用MySQL(或任何关系型数据库) + NoSQL的组合方案。
 
关系型数据库适合存储结构化数据,如用户的帐号、地址:
  1)这些数据通常需要做结构化查询(嗯,好像是废话),比如join,这时候,关系型数据库就要胜出一筹
  2)这些数据的规模、增长的速度通常是可以预期的
  3)事务性、一致性
 
NoSQL适合存储非结构化数据,如文章、评论:
  1)这些数据通常用于模糊处理,如全文搜索、机器学习
  2)这些数据是海量的,而且增长的速度是难以预期的,
  3)根据数据的特点,NoSQL数据库通常具有无限(至少接近)伸缩性
  4)按key获取数据效率很高,但是对join或其他结构化查询的支持就比较差
 
  基于它们的适用范围不同,目前主流架构才会采用组合方案,一个也不能少。目前为止,还没有出现一个能够通吃各种场景的数据库,而且根据 CAP理论,这样的数据库是不存在的。 
 
 

转载于:https://www.cnblogs.com/jeakeven/p/5402095.html

相关文章:

  • 进度条(第七周)
  • JAVA中十四种常见开发工具及其特点
  • spring Thymeleaf 中文乱码 (转)
  • BZOJ4380: [POI2015]Myjnie
  • iOS开发经验总结
  • 人机交互——对搜狗输入法的评价
  • cocos2d-x-3.0 的改变,由于变得太多,一点点累积吧!
  • ThinkPHP函数详解系列
  • 通过手动创建统计信息优化sql查询性能案例
  • EmguCV(OpenCV)实现高效显示视频(YUV)叠加包括汉字
  • 如何优化sql语句
  • Android深度探索(卷1)HAL与驱动开发--读书笔记(第三章)
  • 怎么把文字设置为显示隐藏按钮
  • FCKeditor jsp配置
  • 将字符串编码成数值,求数值最大和问题
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • CSS 三角实现
  •  D - 粉碎叛乱F - 其他起义
  • es6要点
  • MySQL用户中的%到底包不包括localhost?
  • Redis 懒删除(lazy free)简史
  • redis学习笔记(三):列表、集合、有序集合
  • Sublime text 3 3103 注册码
  • 大快搜索数据爬虫技术实例安装教学篇
  • 给Prometheus造假数据的方法
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • ------- 计算机网络基础
  • 前端js -- this指向总结。
  • 学习ES6 变量的解构赋值
  • 用简单代码看卷积组块发展
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #include
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (70min)字节暑假实习二面(已挂)
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)Windows2003安全设置/维护
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET 中的轻量级线程安全
  • .NET基础篇——反射的奥妙
  • [acm算法学习] 后缀数组SA
  • [Android]创建TabBar
  • [autojs]autojs开关按钮的简单使用
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [CF226E]Noble Knight's Path
  • [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.
  • [hibernate]基本值类型映射之日期类型