本文正在参加「技术专题19期 漫谈数据库技术」活动
系列文章:
十分钟入门数据库,入不了就把门卸了 - 掘金 (juejin.cn)
正文
// 朴实无华的分割线
海豚是 Mysql,大象是 PostgreSQL;叶子是 MongoDB.
三分钟,正文已完,谢谢观看。下面全是闲聊。
一、SQL
RDBMS
经过前面的学习,已经知道数据库管理系统,就是管理数据库的系统。
那么关系数据库管理系统 (Relational Database Management System,RDBMS),就是管理关系数据库的系统。
什么是关系数据库?
数据库是数据集合;关系数据库是多组相互之间有关系的数据的集合。
比如,下图 actor_id 和 film_id 之间的关系显而易见,它们将这三张表联系在了一起。actor_id 和 first_name 等被定义为字段。
RDBMS 为数据库提供了图形化的操作界面。不同关系数据库分库,多组关系数据按不同类型定义成为不同的表。
分库分表是为了防止数据杂乱。比如一张表存个1000个字段,肯定找得头晕眼花,反而增加了管理难度。而且这张表如果误删了一条数据,那这1000个字段的数据都没有了。
如果按类型分库分表,一张表里误删了条数据,造成的损失就相比之下较小,因为只删了几个字段的数据。
SQL
有了操作界面还不够,还需要计算机语言来操作关系数据库。
SQL,结构化查询语言 (Structured Query Language),是用来访问、处理的数据库的标准计算机语言。
欸,你可能会问,咱们人工查询、新增删除不也行吗,非学这个语言干嘛。
就像前几天双11,人们下订单的手速和订单量多大,那每秒至少十万级的,不可能给你一年手工导数据吧。所以计算机的事,还是交给计算机语言来做吧。
常见 SQL 数据库:MySQL、SQL Server、PostgreSQL、Oracle、ClickHouse、SQLite 和 DB2等。
区别存在但不限于 SQL 语法、是否开源、数据量级、额外工具等,他们的共同点就是访问和处理关系数据库。
二、NoSQL
垂直扩展和水平扩展
说到网上购物,可以用 SQL 来处理这些数据,但当历史数据量增多、并发数据量增大到其难以负荷的地步时,比如百万、千万,就必须进行扩展。
扩展又分为两种:垂直和水平扩展。垂直就是加钱升级一台服务器 (计算机),水平就是加量买一堆服务器。
单机,即垂直扩展,性能提升不高,且购买金额呈指数级上增,性价比低。
这时候想到水平扩展,水平扩展分为集群和分布式。
集群:将单机复制为几份,并实现负载均衡 (简单地说,将所有需要处理的数据较为均衡的分发给每台服务器),以此提升数据处理能力。
分布式:将系统拆分为多个服务模块,比如将商城拆分成多个独立的服务:用户服务、产品服务、订单服务、后台管理服务、数据分析服务等,将这些服务部署到多台服务器,多台服务器之间相互通信,共享数据。
但你会发现 SQL 很难水平扩展。
原因无他 —— relation,关系。
如果 SQL 在集群上,每台服务器也必须共享数据,每台服务器依旧要对有关系的所有库和表进行更新,这时每台服务器的负载和单机差距不大;
如果用分布式,就会发现,因为数据库本来由很多有关系的表组成,那放在分布式上即使模块分开了,但是该冗余的数据一点没少,还是拿商城举例,至少用户表每台服务器必备。
为了摆脱 relation 带来的影响,人们创造出了新的数据库,NoSQL.
NoSQL
NoSQL 个人比较喜欢定义为 “No Relation and Not Only SQL”。首先,这种数据库管理的数据之间是没有关系的,所以扩展起来很方便。其次,它具有 SQL 一些没有的能力和性质。
SQL 和 NoSQL 对比:
| SQL | NoSQL | |
|---|---|---|
| 可靠性 | 高 | 较低 |
| 扩展性 | 较低 | 高 |
| 分布式 | 难以支持 | 支持 |
| SQL | 支持 | 不支持 |
| 海量数据读写 | 较慢 | 较快 |
NoSQL 牺牲了部分数据一致性,来大量提高数据读写效率和扩展性。
分类:
还有对象数据库、时序数据库等。
三、NewSQL
NoSQL 虽然解决了 SQL 难以扩展、读写海量数据缓慢的问题,但与此同时可靠性、安全性大大降低,也不支持 SQL。
这时候,人们就想为什么不设计一种数据库,将 SQL 和 NoSQL 取长补短呢?于是,NewSQL 出现了。
NewSQL 是对各种新的可扩展/高性能数据库的简称,这类数据库不仅具有 NoSQL 支持分布式和海量数据的存储管理能力,还保持了传统数据库 ACID 和支持 SQL 等特性。
Cloud Spanner
以 Cloud Spanner为例,浅浅讨论一下 NewSQL 是如何做到保留 SQL 特性的同时还做到高扩展性的。
1. 它的表内结构和SQL是相似的,并支持SQL语言
2. 提供父子表结构,使多表进行关联
在 Spanner 中定义 “父-子级” 关系的方式有两种:表交错和外键。
平行表,行物理布局:
父子表:
这时候两表之间的关系为 “Singers(1)”->“Albums(1, 1)”->“Albums(1, 2)”.
3. 数据库分片,扩展性高且支持分布式
Spanner 可以定义交错父子关系的层次结构 (最多7层),即可以将7张表的行定位到一起。若表中数据较少,则单个 Spanner 服务器就能处理数据库。
然而,当表不断增长,达到单个服务器的资源限制时,Spanner 会将数据划分为称为 “分片” 的区块。分片包含一系列连续的行。
如上图,“Singers(2)”->“Albums(2, 1)”->“Songs(2, 1, 1)”->“Songs(2, 1, 2)”->“Songs(2, 1, 3)”->“Albums(2, 2)”->“Albums(2, 3)”->“Songs(2, 3, 1)” 是三张表的行形成的连续行。
各分片之间是可以看作没有关系的,关系都包含在分片里面了,此时它更接近于 NoSQL,这也是 Spanner 支持分布式的原因。
各个分片可以彼此独立移动并被分配给不同的服务器,这些服务器可以位于不同的物理位置。连续行范围的开始和结束称为 “分片边界” 。Spanner 会根据大小和负载自动添加和移除分片边界,这会改变数据库中的分片数量。
当然这样看来它也有一些缺点:比如限定最多7层结构关系,那设计数据库的时候就必须考虑到关联表数,如果有更多结构是否会出现数据冗余。层级太多也并不利于分片,因为子行的大小如果超出分片大小限制,分片是会将连续行分开的。
所以NewSQL也存在缺陷,这也是未来研究的方向。
NewSQL
属于初生阶段,尚不成熟。目前NewSQL系统大致分三类:
1. 新架构
采取了不同的设计方法,大概分为两类:
(1) 工作在一个分布式集群的节点上,其中每个节点拥有一个数据子集。SQL查询被分成查询片段发送给自己所在的数据的节点上执行。这些数据库可以通过添加额外的节点来线性扩展。现有的这类数据库有:Cloud Spanner,VoltDB,Clustrix,NuoDB.
(2) 系统通常有一个主节点的数据源。用来做事务处的节点接到特定的 SQL 查询后,会把它所需的所有数据从主节点上取回来后执行 SQL 查询,再返回结果。
2. SQL引擎
这些系统提供了 MySQL 相同的编程接口,但扩展性比内置的引擎 InnoDB 更好。这类数据库系统有:TokuDB,MemSQL.
3. 透明分片
这类系统提供了分片的中间件层,数据库自动分割在多个节点运行,包括:ScaleBase,dbShards,Scalearc.
最后的最后,又回到了文章的开头:
tips:你问 ACID ?啊,我没戴眼镜,下次丕定
参考:
Mysql拓展知识概括_GeorgeLin98的博客-CSDN博客_mysql扩展内容