大家好我是你们的老朋友,一个在数据管理领域摸爬滚打多年的老兵今天,我要跟大家聊聊一个既重要又有点”高深”的话题——《深入解析DBMS:数据库管理系统全攻略》,让你轻松掌握数据管理核心技能咱们都知道,在现在这个信息的时代,数据就是企业的命脉,而数据库管理系统(DBMS)就是守护这条命脉的超级英雄但说实话,很多人对DBMS的了解可能还停留在”就是存数据的”这个层面,其实啊,里面的门道可多了去了这篇文章就是想带大家深入DBMS的内心世界,看看这个”数据管家”到底是怎么工作的,怎么用得溜
第一章 DBMS的起源与发展:从磁带到云端的进化史
说起DBMS的起源,那得追溯到上世纪60年代那时候,计算机刚起步,数据存储主要靠磁带和穿孔卡片,想想都觉得老土但聪明的人类没闲着,1964年,IBM推出了第一个商业数据库系统IMS(Information Management System),这可是个大事件IMS使用层次模型,虽然现在看来有点简陋,但在当时可是性的它让企业第一次能够用结构化的方式管理大量数据,不再是一堆杂乱无章的记录
层次模型就像一棵大树,数据之间是父子关系,查询效率高,但缺点是结构固定,修改起来比较麻烦到了70年代,关系模型出现了,这是由埃德加·科德(Edgar F. Codd)提出的,他因此获得了1981年的图灵奖关系模型用二维表格来数据,就像我们用的Excel一样,用行和列来表示记录和属性这种模型更加灵活,也更容易理解和使用,所以很快就成了主流不过啊,早期的SQL(Structured Query Language)语法复杂,学习曲线陡峭,让不少程序员头疼不已
到了80年代和90年代,DBMS技术进入了快速发展期Oracle、Sybase、Informix等商业数据库公司纷纷崛起,功能也越来越强大这时候,客户机/服务器架构开始流行,DBMS可以分布在不同地方,通过网络协同工作事务处理能力也得到了极大提升,ACID(原子性、一致性、隔离性、持久性)原则成为衡量数据库可靠性的标准
进入21世纪,互联网的爆发式增长给DBMS带来了新的挑战海量数据、高并发、低延迟成了新的需求这时候,NoSQL数据库异军突起,像MongoDB、Cassandra、Redis等,它们用键值对、文档、列族等不同的数据模型,更好地适应了互联网场景云数据库也成了主流,像阿里云的RDS、腾讯云的TDSQL、AWS的RDS等,提供了更便捷的部署和管理方式
我特别要提到的是,2020年左右,图数据库开始受到关注传统的数据库都是用关系模型来数据,但现实世界中的很多关系是网状的,比如社交网络中的好友关系、知识图谱中的概念关联等图数据库用节点和边来表示实体和关系,查询起来更加直观高效比如,LinkedIn用的就是图数据库,这样才能快速找出你和你认识的人之间的共同好友
第二章 关系型数据库的核心:SQL语言与范式理论
说到关系型数据库,SQL语言绝对是绕不开的核心SQL,全称Structured Query Language,中文就是结构化查询语言它就像数据库的”嘴”,我们通过SQL告诉数据库要做什么我刚开始学SQL的时候,觉得这玩意儿跟数学公式似的,搞得我头都大了但后来慢慢用多了,才发现它其实挺直观的
最基础的SQL语句有四类:SELECT(查询)、INSERT(插入)、UPDATE(更新)和DELETE(删除)比如,我要查询所有年龄大于30岁的用户,可以这样写:
sql
SELECT FROM users WHERE age > 30;
这行代码的意思就是:从users表中,选所有age大于30的记录,全部列都显示出来简单吧但SQL的强大远不止于此比如,我想要查询每个城市的用户数量,就需要用GROUP BY了:
sql
SELECT city, COUNT() FROM users GROUP BY city;
这行代码会返回每个城市及其对应的用户数量是不是很酷
但SQL不只是查询,它还能修改数据比如,我要把所有用户的年龄增加1岁,可以这样写:
sql
UPDATE users SET age = age + 1;
这会修改users表中所有记录的age字段,每个值都加1不过啊,用UPDATE的时候要特别小心,一不小心就可能改错数据我记得有一次,我写了个更新语句,结果忘了加WHERE条件,导致全表数据都被改了,当时真是欲哭无泪
说到关系型数据库,就不能不提范式理论范式就是一套数据设计的规则,目的是让数据存储更加合理,避免数据冗余和更新异常最常用的有第一范式(1NF)、第二范式(2NF)和第三范式(3NF)
第一范式要求每个字段都是不可分割的原子值,简单说就是每一列都不能有重复的子列比如,一个用户表,不能把用户的姓和名放在同一列里,应该分成两列我刚开始做项目的时候,就犯过这个错误,把用户的姓和名放在一起,结果查询和更新都特别麻烦,后来硬着头皮改了好久
第二范式要求表要满足第一范式,并且非主键列必须完全依赖于主键简单说就是,不能有部分依赖比如,一个订单表,主键是订单号,但如果把也放在这个表中,就会产生部分依赖,因为只依赖于客户ID,不依赖于订单号这时候,应该把拆出来单独成表
第三范式要求表要满足第二范式,并且非主键列之间不能相互依赖简单说就是,不能有传递依赖比如,一个员工表,有员工ID、部门ID和部门经理ID如果部门经理也在这张表里,就会产生传递依赖,因为部门经理的信息可以通过部门ID间接得到这时候,应该把部门信息拆出来单独成表
第三章 NoSQL数据库的崛起:应对大数据的解决方案
进入21世纪,随着移动互联网和社交媒体的兴起,数据量呈式增长,传统的SQL数据库开始显得力不从心高并发、海量数据、灵活的数据模型成了新的需求,这时候,NoSQL数据库就应运而生了
NoSQL,全称Not Only SQL,意思就是不只是SQL它泛指所有非关系型数据库,包括键值存储、文档存储、列族存储和图数据库等我第一次接触NoSQL是在2013年左右,当时我们项目需要处理海量用户行为数据,SQL数据库根本扛不住,只能转而寻找NoSQL方案
键值存储是最简单的NoSQL类型,它用键来存取值,就像字典一样最典型的代表是Redis和MemcachedRedis特别灵活,可以用字符串、列表、集合、哈希等数据结构来存储数据,而且支持持久化我做过一个秒杀项目,用Redis来存储抢购信息,效果特别好,因为查询和更新都特别快Redis的命令也很简单,比如set、get、lpush、rpop等,一看就懂
文档存储用类似JSON、BSON等格式的文档来存储数据,每个文档可以有不同的字段最典型的代表是MongoDB文档存储的优点是灵活,不需要预定义表结构,可以随时添加或删除字段我做过一个内容管理系统,用MongoDB来存储文章,特别方便,因为文章可以有不同字段,比如有的文章有图片,有的没有,有的有视频,有的没有,用MongoDB来存正好合适
列族存储按列来数据,适合做数据分析最典型的代表是Cassandra和HBase列族存储的优点是读写速度快,特别适合做大规模数据存储我做过一个日志分析项目,用Cassandra来存储日志数据,效果特别好,因为每天要存几TB的数据,用Cassandra来存既快又稳定
图数据库用节点和边来表示实体和关系,特别适合做关系分析最典型的代表是Neo4j和JanusGraph图数据库的优点是查询关系特别快,适合做社交网络、知识图谱等场景我做过一个社交推荐项目,用Neo4j来存储用户关系,效果特别好,因为可以快速找出用户之间的共同好友、共同兴趣等
我特别要提到的是,NoSQL并不是要取代SQL,而是要补充SQL对于需要事务保证、复杂查询的场景,还是应该用SQL数据库;对于需要高并发、海量数据、灵活数据模型的场景,可以考虑用NoSQL现在很多大型互联网公司都用混合架构,既有SQL数据库,也有NoSQL数据库