SQL还是NoSQL?架构师必备选型技能
很多时候我们都会有这样的疑问。
如果这时候直接去看MySQL、Mongo、HBase、Redis等数据库的用法、特点、区别,其实有点太着急了。
这时候,最好从「数据模型」开始讨论。
1、SQL vs NoSQL
现在最著名的数据模型应该是SQL,它基于Edgar Codd在1970年提出的关系模型:
数据被组织成关系(relations),在SQL中称为表(table),其中每个关系都是元组(tuples)的无序集合(在SQL中称为行)。
那什么是NoSQL?
现在很多非关系型数据库会被称为NoSQL,其含义往往被解释 “Not only SQL”。
采用NoSQL的驱动因素在于:
- 数据量。 比SQL更好的扩展性需求,包括支持超大数据集或超高写入吞吐量
- 查询方式。 关系模型不能很好支持的一些特定查询操作
- 动态扩展。 对关系模式的一些限制表示沮丧,需要更加具有动态和表达力的数据模型
2、数据模型的差异
SQL 和 NoSQL数据库的差异有很多,包括容错性和并发处理,我们这里暂时只讨论数据模型的差异。
关系型模型的主要优势在于:
- 联结操作
- 多对一和多对多关系更简洁的表达
注意,简单的多对多适合关系型模型,复杂的多对多更适合图模型
我们以文档型NoSQL为例,它和SQL对比的核心优势在于:
- 模式灵活性
- 局部性带来的性能优势
2.1 模式灵活性
「模式灵活性」的特点,往往被称为「schema-fress模式」,但是我们并不能将它直接理解为“无模式”。
因为我们在读取数据时,往往存在某种数据结构的隐式转换,所以我们称之为「读时模式」更准确(数据结构是隐式的,只有读取时才解释)。
而传统关系型数据库,对应可以称之为「写时模式」(模式是显示的,并且在写入数据库时被约束必须遵守)。
这两者差异跟编程语言中的动态检查(运行时)和静态检查(编译时)比较类似。
「模式灵活性」的优点在于:
- 避免了大表变更时的停机或者耗时
- 支持包含多种类似数据结构
- 可以随时改变数据结构
「模式灵活性」带来的损害则是需要应用层做好结构约束,并且保证对历史数据的兼容性。
一般典型关系型场景,「模式灵活性」反而会导致难以维护。
2.2 局部性的性能优势
注意注意,局部性优势仅适用于需要同时访问文档中大部分数据的场景。
如果我们的查询需要访问整个文档,那么存储局部性具备显著的性能优势。
此时,如果数据被划分到了多个表中,则需要访问多个表来检索数据,会浪费更多的磁盘IO并花费更多的时间。
如果我们的访问只需要文档中的一小部分数据,那么对于大型文档来说就是一种浪费。
3、数据模型分析原则
对于一份数据存储,「数据模型」的建立, 就是考虑应该通过 SQL 还是 NoSQL 进行 数据组织 。
那么,结合前面对SQL和NoSQL的介绍与对比,我们总结了以下几个维度,来具体考虑如何建立「数据模型」。
3.1 数据对象关系
多对一或者多对多,一般考虑SQL。
一对多的关系,可以考虑SQL或者NoSQL。
3.2 查询性能
如果我们的查询通常需要访问整个文档,那么存储局部性具备显著的性能优势,关系型的join性能较差,因此可以考虑NoSQL。
(业务上,一般会通过整体结果缓存,对关系型join查询加速)
如果通常是局部数据对象、独立实体查询,考虑SQL。
3.3 写入吞吐量
如果需要超高的写入吞吐量,考虑NoSQL。
3.4 扩展性
- 属性扩展:如果对象属性不确定,且经常变动,NoSQL更灵活。
- 超大数据集扩展:NoSQL通常更好。
- 单value大小:单value如果过大,可能导致数据库写入失败。考虑拆分对象,或者分级存储到对象存储。一般单value不要超过100KB(压缩后)。
3.5 延迟选择数据库类型
数据模型分析主要是根据业务场景区分 关系型 还是 非关系型。
延迟考虑具体数据库选型,用RDS还是Mongo还是其他数据库,它们之间的功能性差异在逐渐变少。
具体选择可以结合 研发人员熟悉程度、数据规模、其他非功能性需求 来判断。
一些例子:
- Mongo 4.x支持事务
- MySQL 8.0支持JSON格式
- DB-engine上,mysql和mongo都从本身定位逐步扩展为multi-model
参考:
《数据密集型应用系统设计》
都看到最后了,原创不易,点个关注,点个赞吧~
文章持续更新,可以微信搜索「阿丸笔记 」第一时间阅读,回复【笔记】获取Canal、MySQL、HBase、JAVA实战笔记,回复【资料】获取一线大厂面试资料。
知识碎片重新梳理,构建Java知识图谱:github.com/saigu/JavaK…(历史文章查阅非常方便)
SQL还是NoSQL?架构师必备选型技能的更多相关文章
- Java架构师必备技能:docker使用大全
前言 java工程师成长为架构师是一个艰难且耗费心力的过程,不仅仅需要熟悉java体系内相关的技术,同时要掌握许多运维相关的操作技能,随着k8s逐渐成为微服务持续集成开发难以越过的基础设施之后,d ...
- 架构师必备:系统容量现状checklist
正如飞机在起飞前,机长.副机长要过一遍checklist检查,确认没问题了才能起飞.楼主也整理了一个系统容量现状checklist,方便对照检查.本文搭配架构师必备:如何做容量预估和调优,食用更佳. ...
- 架构师必备:MySQL主从同步原理和应用
日常工作中,MySQL数据库是必不可少的存储,其中读写分离基本是标配,而这背后需要MySQL开启主从同步,形成一主一从.或一主多从的架构,掌握主从同步的原理和知道如何实际应用,是一个架构师的必备技能. ...
- .NET架构师必备知识
.NET架构师,我归纳一下要学的知识: 成为优秀程序员,需要学好的知识: 1. 面向对象编程.UML画图.设计模式.代码重构 2. 常用ORM工具 3. MVC,WCF,XMl, JQuery ,S ...
- 架构师必备技能指南:SaaS(软件即服务)架构设计
1.介绍 从计算机诞生开始,就伴随着计算机应用程序的演变.简短的回顾历史,我们可以清楚的看到应用程序发生的巨大变化.上世纪70年代中期,随着个人PC机的爆炸式增长以及程序员的崛起,让计算机的计算能力得 ...
- 架构师必备:巧用Canal实现异步、解耦的架构
本文介绍如何应用Canal实现异步.解耦的架构,后续有空再写文章分析Canal原理和源代码. Canal简介 Canal是用来获取数据库变更的中间件. 伪装自己为MySQL从库,拉取主库binlog并 ...
- 架构师必备:MySQL主从延迟解决办法
上一篇文章介绍了MySQL主从同步的原理和应用,本文总结了MySQL主从延迟的原因和解决办法.如果主从延迟过大,会影响到业务,应当采用合适的解决方案. MySQL主从延迟的表现 先insert或upd ...
- 架构师必备:Redis的几种集群方案
结论 有以下几种Redis集群方案,先说结论: Redis cluster:应当优先考虑使用Redis cluster. codis:旧项目如果仍在使用codis,可继续使用,但也推荐迁移到Redis ...
- 架构师必备:HBase行键设计与应用
首先要回答一个问题,为何要使用HBase? 随着业务不断发展.数据量不断增大,MySQL数据库存在这些问题: MySQL支持的数据量为TB级,不能一直保留历史数据.而HBase支持的数据量为PB级,适 ...
- 架构师必备软件:安装Dubbo注册中心(Zookeeper-3.4.6)
Dubbo建议使用Zookeeper作为服务的注册中心. http://www.roncoo.com/details?cid=f614343765bc4aac8597c6d8b38f06fd 注册中心 ...
随机推荐
- .NET 7 新特性全面解析
在 2021 年 11 月 8 日发布的 .NET 6 当前已经广泛使用.微软团队已经开始着手为.NET 7制定计划和新特性.本文将为您全面解析.NET 7 的新特性,并提供源代码示例. 1. 更好的 ...
- 【AI新趋势期刊#1】GPT自动理解视频、AI法律顾问、大模型安全围栏
每天都要浏览大量AI相关新闻,是不是感到信息量爆炸,有效信息少? 这么多新产品和新工具,到底哪些是真正是有价值的,哪些只是浮躁的一时热点? 想参与AI产品和工具的开发,从哪里能够获得大量的灵感和思路? ...
- 从Excel 电子表格中读取数据并插入到数据库的简单方式
using (FileStream fileStreamRead = new FileStream("new.xls" , FileMode.Open )) { //创建工作簿 I ...
- 聊一聊Java中的Steam流
1 引言 在我们的日常编程任务中,对于集合的制造和处理是必不可少的.当我们需要对于集合进行分组或查找的操作时,需要用迭代器对于集合进行操作,而当我们需要处理的数据量很大的时候,为了提高性能,就需要使用 ...
- JVM中的编译器
JVM中集成了两种编译器,Client Compiler和Server Compiler,它们的作用也不同.Client Compiler注重启动速度和局部的优化,Server Compiler则更加 ...
- base64详解
base64详解 前置知识 位与字节 二进制系统中,每个0或1就是一个位(bit,比特),也叫存储单元,位是数据存储的最小单位. 其中8bit就称为一个字节(Byte). 1B=8位 位运算 与运算: ...
- Blazor前后端框架Known-V1.2.7
V1.2.7 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...
- 关于NOI2010“超级钢琴”的反思
[NOI2010] 超级钢琴 题目描述 小 Z 是一个小有名气的钢琴家,最近 C 博士送给了小 Z 一架超级钢琴,小 Z 希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出 \(n\ ...
- burp抓包iPhone手机
https://blog.csdn.net/weixin_43965597/article/details/107864200
- MacOS系统(M1/M2)安装AI绘画StableDiffusion保姆级教程
安装完成后,推荐阅读这篇教程:AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通 实操环境: macOS 13 Arm64(建议12以上的系统使用) Apple M1 先来看几个样 ...