ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据库系统组成与MySQL实操:第一周学习路线与核心概念

数据库系统组成与MySQL实操:第一周学习路线与核心概念 1. 1.4节到底在讲什么先看清这门课第一周的时间线1.1 果园平台与第一周1.4的真实身份北邮果园平台的数据库课程第一周的进度条停在第1.4节上。很多同学打开课件的第一反应是这不就是绪论吗第1.1节讲数据、数据库、数据库管理系统、数据库系统这四个词第1.2节讲数据管理技术的三个发展阶段第1.3节讲数据模型到了1.4节开始进入数据库系统的组成与结构。不同教材对1.4节的命名略有差异有的叫数据库系统的组成有的叫数据库系统的结构。但翻来覆去核心就两件事数据库系统由哪些部分组成以及数据库系统内部用什么样的层级结构来组织数据。组成考的是硬件、软件、数据、人员这几块的记忆与理解结构考的则是三级模式与两级映像。很多同学觉得这两块内容全是文字太虚了。我一开始也这么想但等做到后面的实验发现几乎所有报错都和这两节的内容多少有点关系。比如连接不上数据库时排查的第一步就是弄清楚客户端连的到底是数据库管理系统还是数据文件——听起来很玄实际上就是你连的是服务实例不是磁盘文件这种常识。1.2 系统组成里的软件部分后面每节课都在用数据库系统的组成课本上的标准答案是硬件平台、数据库、软件数据库管理系统、操作系统、应用开发工具、人员数据库管理员、应用程序员、终端用户。这句话表面上是填空题考点但要多想一步第一周就把人员这个角色模型弄明白对后面课程设计的分工特别有用。数据库管理员DBA负责安装、配置、备份、权限管理应用程序员负责写业务代码调用SQL终端用户只通过界面操作完全不接触SQL。理工科课程通常会让大家分组做课程设计如果组里有人连这三种角色都分不清项目后期一定会乱。软件部分更是后面所有实操的地基你以为在MySQL里执行一条SELECT背后涉及的是数据库管理系统解析SQL、优化执行计划、访问存储引擎、返回结果集。第一周如果只背数据库管理系统是核心软件这一句话不去亲手装一个MySQL执行一遍后面理解连接池、预编译、索引都会很吃力。1.3 1.4节在整门课坐标系里的位置如果把这门课比作盖楼第1.1到1.2节是选址论证第1.3节是画图纸规范第1.4节就是打地基。数据库系统的组成和结构决定了你后面学SQL、学事务、学并发控制时的思考框架。我在果园作业区看到不少同学第一周的心得问得最多的问题是为什么要学三级模式直接建表不就行了吗。这个问题的答案恰恰是1.4节存在的意义——数据库要解决的核心矛盾是多个应用共享数据又要彼此隔离。没有层级结构共享和隔离只能二选一。等你做到多用户并发实验、权限实验的时候会反复体会这一点。所以第一周的学习建议是不急着刷题先花点时间把1.4节的组成四块和三层结构用自己的话讲清楚。讲不清楚就回果园把课件再看一遍或者自己找一张数据库系统结构示意图照着画一遍。画图不是浪费时间是逼自己把概念之间的箭头关系捋顺。2. 第一周实操起点从下载一个MySQL开始2.1 为什么第一周就要装数据库而不是期末再说课程安排只要求看课件但以我的经验第一周就把环境装好这周学到的所有概念都会自动落地。原因很简单你装好数据库做完建库、建表、插入、查询这一整套动作之后再看数据库管理系统是管理数据库中数据的核心软件这种句子会瞬间觉得它说的是一个你已经熟悉的东西。选型上建议用MySQL 8.4 LTS。网上不少教程还在教MySQL 5.7但官方对5.7的支持已经进入收尾阶段新学就直接上8.x系列。8.4是当前的LTS版本稳定周期长课程作业和毕业设计都能用。下载时认准MySQL Community Server这个是免费版不要下一步点到商用付费的MySQL Commercial。2.2 从下载到初始化完整步骤照着做就好具体步骤以Windows环境为例macOS和Linux思路一致命令略有差异到MySQL官网下载页选MySQL Community Server版本选8.4.x平台选Windows下载ZIP Archive包。ZIP包比MSI安装包清爽不会装一堆你用不到的东西。解压到纯英文路径比如C:\mysql-8.4。路径带中文后面不少工具会出奇怪问题别给自己挖坑。解压后先建一个my.ini配置文件内容参考这份最小配置[mysqld] basedirC:/mysql-8.4 datadirC:/mysql-8.4/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci [client] default-character-setutf8mb4这里有几个关键点datadir是数据目录第一次启动前必须不存在或为空MySQL会自己初始化port默认3306如果想用其他端口后面所有客户端工具都要跟着改字符集建议一上来就用utf8mb4不然做第一周作业时中文数据很容易乱码。打开管理员权限的命令提示符进入解压目录的bin文件夹执行初始化命令mysqld --initialize-insecure--initialize-insecure的意思是初始化数据目录并且root账号初始密码为空。用它而不是mysqld --initialize是因为空密码登录后立刻自己ALTER USER设密码比处理一串随机临时密码更省事。启动服务mysqld --console看到ready for connections就说明启动成功。这个窗口不要关它就是你的临时MySQL服务端。想后台运行可以用net start mysql的方式注册成Windows服务但第一周临时用mysqld --console完全够用。2.3 可视化工具dbx、DBeaver、Navicat怎么选服务起来之后你会立刻面对另一个问题用什么东西操作数据库命令行mysql -u root -p永远是最保底的手段但装个可视化工具效率会高很多。果园课程群里大家讨论过的工具有几种DBeaver开源免费跨平台功能覆盖全缺点是第一次装需要下载驱动网络差时容易卡Navicat是商业软件界面漂亮连接管理方便但试用期有限dbx数据库工具是不少同学图省事的选择主打轻量和免安装。我的建议是课内作业用哪个都行但至少会用命令行执行一次增删改查因为考试和机试不会保证有图形界面。可视化工具连接MySQL时填主机127.0.0.1、端口3306、用户名root、密码是你自己设的那个。连接报错的话八成原因在下面第四章。2.4 第一条SQL仪式感与验证并存环境装好后的第一件事不是急着建表而是先确认你装的东西真的能干活。在命令行执行SELECT VERSION();能返回类似8.4.0的版本信息说明安装成功。然后建一个测试库CREATE DATABASE course_db CHARACTER SET utf8mb4; USE course_db;这两个语句做完你可以体会一下数据库系统由数据库、数据库管理系统共同构成这句话的真实含义CREATE DATABASE创建的是数据库一堆数据文件和元数据USE之后你做的事情全都是在和数据库管理系统对话。二者不是一回事这是考试里常考的区分点。3. 三级模式、两级映像和增删改查怎么互相印证3.1 三级模式两级映像到底在解决什么问题很多教材把三级模式两级映像画成三层框框加两条箭头学生看完只记住外模式、概念模式、内模式六个字。但它的本质是一个工程问题数据库要让不同用户看到不同的数据同时底层的存储结构可以随意调整而用户程序不用改。外模式External Schema也叫子模式或用户模式是某个具体应用能看到的数据视图。比如学生管理系统中学工处只看得到姓名、班级、学号看不到成绩。概念模式Conceptual Schema又叫模式是整个数据库全局的逻辑结构。它描述所有数据以及数据之间的联系对应你设计的那么多张表。内模式Internal Schema存储模式描述数据在物理磁盘上怎么存、怎么建索引、怎么压缩。两级映像分别是外模式与概念模式之间的映像、概念模式与内模式之间的映像。它们的存在保证了三层可以各自独立调整。数据文件换了存储引擎只要内模式到概念模式的映像不变上层一概无感。给某个应用新增一个视图只要外模式到概念模式的映像建立好底层一张表都不需要动。3.2 从模式到表概念模式就是你的建表蓝图第一周作业里出现次数最多的数据库是学生选课类的小系统。你设计出来的那些表合起来就是整个数据库的概念模式某一张学生在校园App里看到的个人信息卡片就是外模式的具体体现MySQL在磁盘上按InnoDB格式存的.ibd文件就是内模式。所以你现在建表时每个字段的类型、长度、约束都是在定义概念模式你用CREATE VIEW创建视图就是在定义外模式你设的索引、主键存储方式就是在设计内模式。三句话三级模式就全落到了实操上。3.3 一次完整的建库建表加增删改查以学生-课程为例第一周就能跑的完整流程如下。建表CREATE TABLE student ( student_id CHAR(10) PRIMARY KEY, name VARCHAR(20) NOT NULL, dept VARCHAR(30), age INT ); CREATE TABLE course ( course_id CHAR(6) PRIMARY KEY, course_name VARCHAR(50) NOT NULL, credit INT ); CREATE TABLE sc ( student_id CHAR(10), course_id CHAR(6), grade INT, PRIMARY KEY (student_id, course_id), FOREIGN KEY (student_id) REFERENCES student(student_id), FOREIGN KEY (course_id) REFERENCES course(course_id) );插入数据INSERT INTO student VALUES (2024210001, 林同学, 计算机学院, 19); INSERT INTO course VALUES (CS101, 数据库系统, 3); INSERT INTO sc VALUES (2024210001, CS101, NULL);查询和修改SELECT s.student_id, s.name, c.course_name, sc.grade FROM student s JOIN sc ON s.student_id sc.student_id JOIN course c ON sc.course_id c.course_id; UPDATE sc SET grade 92 WHERE student_id 2024210001 AND course_id CS101; DELETE FROM sc WHERE student_id 2024210001 AND course_id CS101;这一套跑下来你其实已经把增删改查全过了一遍INSERT是增DELETE是删UPDATE是改SELECT是查。第一周的核心要求就是把这张表、这三条语句弄熟后面的实验都是在这个基础上加条件、加关联、加事务。3.4 习题里模式/外模式/内模式怎么判断第一周课后题经常给一段描述问这属于三级模式中的哪一级。我的判断方法是用户视角是外模式全局逻辑是模式存储细节是内模式。比如学生成绩查询系统只显示学号、姓名、成绩是外模式数据库中定义学生表、课程表、成绩表及其关系是模式成绩表按学分索引存放在磁盘某个表空间是内模式。这个方法虽然朴素但对付第一周小题足够用。重点是它逼你把概念落到用户-全局-存储三个视角而不是死背层级名称。等学到后面的视图、索引、权限管理你会发现这套判断标准依然好用。4. 第一周绕不开的报错现场服务、连接、驱动、乱码4.1 服务起不来端口占用和data目录残留第一周最常见的报错是mysqld --console启动后立刻退出日志里写Bind on TCP/IP port: Permission denied或Port 3306 already in use。原因几乎永远是两个一是3306端口被别的MySQL实例占用了二是上次初始化失败后data目录残留了半成品文件。处理顺序如下先查端口占用命令行执行netstat -ano | findstr :3306看输出最后一列是哪个进程的PID再到任务管理器里对比是否有一个mysqld进程在运行。如果有杀掉或换端口如果没有看PID对应的是不是别的程序比如某些开发环境自带的MariaDB。data目录残留的解法更简单把整个data目录删掉重新mysqld --initialize-insecure初始化一次。第一次学安装的人data目录一定要按官方文档从零初始化千万别手动往data里放杂七杂八的文件。4.2 可视化工具连接失败三件套排查用 DBeaver、Navicat 或 dbx 连接时提示Access denied for user rootlocalhost或Communications link failure别慌按顺序查三件事服务端是否真的在监听netstat -ano | findstr :3306有没有 LISTENING 状态的记录。用户名和密码是否正确用命令行本地登录试试mysql -u root -p。如果命令行能进、工具进不去检查工具的连接URL、端口、SSL设置。是否允许远程连接第一周本地练习连接Host直接用127.0.0.1或localhost不要填本机IP本机IP可能被防火墙挡。Access denied还有一种常见情况是root的认证插件是caching_sha2_password老工具不认识这个新插件就会报认证失败。解决办法是把root改回mysql_native_password或者升级工具版本。我建议直接升级工具毕竟mysql_native_password在新版MySQL里早晚要退役。4.3 驱动报错与ODBC的坑网上搜数据库这个词经常能看到请先安装access数据库64位系统驱动程序“64位引擎不支持dbc数据只支持access数据”这类报错。它们本质上是同一个问题32位和64位驱动混装。微软ACE驱动有32位和64位两个版本系统是64位的但Office装了32位数据库引擎装64位Excel导入导出时就会报这种驴头不对马嘴的错误。第一周如果你只用MySQL大概率碰不到ODBC。但有些课程设计会要求把Excel数据导入数据库或者数据库导出到Excel到时候这个坑就会冒出来。解决思路是卸载冲突版本只保留匹配Office位数的那一个纯64位环境就装上64位ACE驱动然后去ODBC数据源管理器里检查驱动列表是否正常显示。4.4 中文数据乱码字符集不统一做第一周作业时往表里插入中文SELECT出来全是???或者命令行里中文正常但可视化工具里乱码。这个问题几乎都是字符集不一致造成的。我推荐的统一方案是服务端my.ini里把character-set-server、character-set-client都设成utf8mb4建库时显式带CHARACTER SET utf8mb4表结构里的字符串字段也用VARCHAR搭配数据库默认字符集。只要这三层统一中文基本不会再出问题。检查字符集最快的方法SHOW VARIABLES LIKE character_set%;看到connection、database、server都是utf8mb4就安心了。如果某个值不对改完my.ini后重启服务再检查。5. 第一周就该知道的数据库生态那些热搜词背后是什么5.1 关系型之外SQLite、MongoDB、TDengine的出现场景刚学数据库所有例子都是MySQL、Oracle这类关系型数据库。但热搜词里大量出现的SQLite和MongoDB其实代表了另外两类重要形态。SQLite是一个单文件嵌入式关系数据库不用独立服务端整个数据库就是一个文件。很多手机App、本地工具、Linux系统服务都用它做轻量存储。第一周学到数据库系统由数据库和数据库管理系统组成时可以想想SQLite的例子它把两者压缩到一个文件里更极端地展示了管理系统和数据的边界其实是设计出来的。想体验的话用DB Browser for SQLite这类工具可以直接打开.db文件不用安装任何服务。MongoDB是文档型数据库数据以文档形式组织对应数据库(database)、集合(collection)、文档(document)这三级概念。它和关系型最大的区别是不强制表结构一致每一条文档的字段可以不同。第一周不必细究MongoDB但应该理解不是所有数据都适合塞进关系模型JSON这类半结构化数据用文档库更顺手。TDengine则是时序数据库的代表专门处理物联网、设备监控这类带时间戳的海量数据。热搜里的tdengine, c绑定写入数据库,taos_stmt_prepare说的是TDengine提供的C/C预编译写入接口。它和普通关系库的SQL风格有差异但对时间序列场景性能极高。第一周看到这些词知道它们是数据库生态的一角就够了不要被吓到。5.2 连接池、并发锁、死锁其实都在讲同一个并发问题第一周不会讲并发但如果你提前看到mysql的数据库连接池数据库并发锁数据库死锁这些词我建议你只记住一个问题模型多个用户同时读写同一条数据时系统怎么保证不错不乱。连接池解决的是频繁创建、销毁连接开销太大的问题——预先创建一批连接放着谁用谁拿用完归还并发锁解决的是同时写同一行数据的问题——锁就是互斥标记先到者先改死锁则是两个事务互相等对方持有的锁永远等不到的坏局面。第一周不需要会处理死锁但可以做一个思想实验两个人同时点同一个按钮去改同一条记录的余额会发生什么想明白这个场景后面学隔离级别、行锁、间隙锁、事务日志理解起来会顺畅得多。5.3 达梦、人大金仓国产数据库到底在学什么热搜里有大梦数据库安装和人大金仓数据库docker这里的大梦就是达梦数据库的谐音。达梦和人大金仓都是国产关系型数据库它们和Oracle、MySQL解决的是同一个问题只是实现方式和生态不同。第一周你不需要安装它们但值得知道一个事实国内不少行业在数据库选型上会考虑自主可控所以会采用达梦、金仓这类产品。它们的SQL语法大体兼容国际主流数据库很多课程设计会以从MySQL迁移到达梦作为大作业。第一周能把MySQL摸熟后面迁移不会太痛苦。5.4 第一周学习安排的优先级如果你时间有限我给的建议优先级是教材概念大于工具技巧命令行大于图形界面建库建表加查询大于其他一切。工具、驱动、连接池、国产数据库都是第二周之后慢慢熟悉的东西。第一周只要把数据库系统组成、三级模式结构、第一个MySQL环境、第一张表这四件事拿下这周就算圆满。6. 一点个人体会说句实在话数据库第一周的1.4节是我大学阶段见过的最劝退的章节之一——它不给你任何立竿见影的成就感全是抽象概念。但等我真的把第一篇实验报告写完、把第一个课程设计做完再回头看那些当时觉得绕口的两级映像概念模式其实早就变成了我日常写建表语句、看执行计划时的潜意识。所以学这节内容我自己的方法就是概念和操作对读课本说一句数据库系统由数据库、数据库管理系统、应用程序和用户组成我就去本机把MySQL空密码初始化一遍用命令行建一个测试库用可视化工具连一次——概念就从填空题变成了经验。如果在果园平台第一周作业里卡住了别急着背题先把环境跑通把那张学生选课的表建出来你会发现后面的路顺畅很多。祝第一周顺利。
返回列表