1. 首页 > MySQL教程 > 正文

数据库教程FGMT36‑MySQL数据对象开发及数据库建模设计

数据库教程FGMT36‑MySQL数据对象开发及数据库建模设计
## 前言
在企业级MySQL运维与数据库开发工作中,仅仅掌握基础增删改查SQL不足以支撑复杂业务系统落地。数据库对象开发、规范化数据建模是DBA、运维工程师、后端开发人员必须掌握的核心能力。本套风哥教程围绕索引、约束、视图、存储过程、触发器、游标、自定义函数、数据库范式与逆向工程展开,面向IT运维、DBA、云计算、软件开发从业人员,完整覆盖数据库对象管理、SQL编程、数据库建模全流程实操知识。

风哥教程本文实验环境部署两套独立MySQL实例,两套实例互不关联,主机名分别为**fgedu‑net‑cn1**、**fgedu‑net‑cn2**,硬件规格统一为64G内存、8CPU;数据存储路径统一修改为`/fgedudb`;数据库实例名、数据库名、业务用户名统一命名为`fgedudb`、`fgedudb`、`fgedu`,所有命令均可直接在实验环境复现。

本套风哥教程知识结构分为两大模块,第一模块为MySQL数据库对象管理与开发,包含索引创建设计、约束管理、视图开发、存储过程、触发器、游标、数据库建模;第二模块讲解自定义存储函数、SQL内置函数实战,覆盖聚合函数、字符函数、转换函数、时间日期函数、比较函数。下文会先完成基础理论解析,再通过大量可复现的实操命令完成对象创建、查询、修改、删除全流程演练,最后完成数据库建模、范式设计、逆向工程案例实操。

## 一、MySQL数据库对象管理与开发理论部分
### 1.1 索引理论
索引是数据库的重要对象,本质上是一种有序的数据结构,用于加速数据表检索操作,索引会单独占用磁盘存储空间,DML操作(INSERT、UPDATE、DELETE)执行时数据库需要同步维护索引结构,因此索引可以提升查询性能,但会对写入性能带来损耗。

索引主要优点:大幅降低查询扫描的数据行数,减少磁盘IO开销;支持唯一性约束,保障字段数据唯一;支持排序分组,避免大量文件排序操作。索引的缺点:占用额外磁盘存储空间;增加写入操作开销;索引需要定期维护,碎片会降低索引执行效率。

索引分类按照存储结构可以分为B‑Tree索引、Hash索引;按照功能分为普通索引、唯一索引、主键索引、全文索引;按照字段数量分为单列索引、联合复合索引。设计索引需要遵循核心原则:优先给WHERE条件、JOIN关联字段、ORDER BY、GROUP BY字段建立索引;避免在低基数、重复值极高字段创建索引;联合索引遵循最左前缀原则;禁止过度创建索引,无用索引需要及时清理。

>风哥 itpux‑com

### 1.2 约束理论
约束用于保障数据表数据完整性,分为实体完整性、参照完整性、域完整性三大类。MySQL支持的约束包含主键约束PRIMARY KEY、唯一约束UNIQUE、非空约束NOT NULL、默认值约束DEFAULT、外键约束FOREIGN KEY、CHECK检查约束,MySQL8.0版本完整支持CHECK约束校验逻辑,旧版本仅做语法兼容不执行校验逻辑。

主键约束一张表只能存在一个,主键字段不允许NULL、不允许重复;唯一约束允许字段存在NULL值,同一个表可以设置多个唯一约束;外键约束实现多表参照完整性,仅InnoDB存储引擎支持;CHECK约束用于限定字段合法取值范围。表选项包含存储引擎、字符集、排序规则、行格式、压缩参数,64G内存8CPU生产环境InnoDB推荐设置字符集utf8mb4,行格式Dynamic。

### 1.3 视图理论
视图属于虚拟数据库对象,视图本身不存储真实业务数据,视图存储的是SELECT查询定义语句,访问视图时会动态执行底层查询语句返回结果集。视图核心特性:虚拟表,无物理存储;基于基表构建;部分视图支持DML操作,聚合、分组、DISTINCT的视图不支持增删改。

视图作用:简化复杂多表查询逻辑;实现访问权限隔离,隐藏基表敏感字段;统一业务查询口径;简化报表开发。视图的限制:无法创建索引;DDL修改基表会影响视图有效性;带聚合函数、UNION、GROUP BY的视图不支持DML。适用场合:报表统计、业务权限隔离、封装复杂查询逻辑。

>风哥教程 113257174

### 1.4 存储过程理论
存储过程是存放在数据库服务端、预编译完成的SQL语句集合,支持输入、输出参数,实现业务逻辑封装,支持流程控制、循环、条件判断逻辑。存储过程优势:SQL逻辑预编译,减少网络传输开销;业务逻辑集中维护;支持事务处理;可以实现复杂业务逻辑。适用场景:批量数据处理、复杂统计、业务逻辑封装。存储过程由过程体、参数列表组成,参数分为IN输入参数、OUT输出参数、INOUT输入输出参数。

### 1.5 触发器理论
触发器是数据表的事件驱动对象,当数据表发生INSERT、UPDATE、DELETE事件时自动触发执行预设SQL逻辑,不需要手动调用。触发器触发时机分为BEFORE(事件执行前)与AFTER(事件执行完成之后),每一行数据变更都会执行触发器逻辑FOR EACH ROW。触发器常用场景:数据变更审计日志、数据同步、业务规则校验。触发器的弊端:触发器逻辑隐藏,故障排查难度提升,复杂业务尽量控制触发器数量。触发器中使用NEW代表变更之后的数据行,OLD代表变更之前的旧数据行,INSERT仅存在NEW对象,DELETE仅存在OLD对象,UPDATE同时存在NEW、OLD对象。

>风哥数据库教程 itpux‑com

### 1.6 游标理论
游标用于存储SELECT查询返回的结果集,实现逐行遍历结果集,在存储过程内部使用。游标执行流程:声明游标、打开游标、读取游标数据、关闭游标。MySQL游标仅支持只读,不支持回滚,适合小结果集逐行处理,大数据集场景不推荐使用游标,会带来性能损耗。

### 1.7 MySQL数据库建模理论
数据库建模是业务系统开发前置工作,通过概念模型、逻辑模型、物理模型完成数据表设计。三大范式是关系数据库设计基础。第一范式1NF:列原子性,字段不可再拆分;第二范式2NF:消除部分函数依赖,非主键字段全部依赖完整主键;第三范式3NF:消除传递依赖,非主键字段之间不能互相依赖。范式可以降低数据冗余,但是部分业务场景为提升查询性能允许适度反范式设计,增加冗余字段减少多表关联查询。

数据库开发设计规范包含命名规范、字段类型选择、主键设计、索引规范、约束规范、注释规范。逆向工程,即从已经存在的物理数据库反向导出EER实体关系模型,生成ER图,梳理表之间关联关系,常用于接手存量业务系统数据库梳理工作。

>网上搜索风哥教程可以学习全套数据库教程

### 1.8 MySQL存储函数与内置函数理论
存储函数也叫自定义函数,存储函数必须有且仅有一个返回值,只能使用IN类型输入参数,可直接嵌入SELECT语句内部调用,存储函数内部不支持事务操作,这是存储函数和存储过程最核心差异点。

|对比项|存储过程PROCEDURE|存储函数FUNCTION|
| —- | —- | —- |
|调用方式|CALL 过程名()|SELECT 函数名()|
|返回值|支持0个、1个或多个返回值,依靠OUT/INOUT参数|强制要求1个返回值|
|参数类型|IN、OUT、INOUT|仅IN参数|
|事务支持|支持事务操作|不允许事务处理|
|使用位置|独立调用,不能嵌入SELECT语句|可嵌入SELECT、WHERE子句|

内置函数是MySQL系统自带函数,包含聚合函数COUNT、SUM、MAX、MIN、AVG;字符处理函数SUBSTRING、CONCAT、REPLACE;转换函数CAST、CONVERT;时间日期函数NOW、DATE_FORMAT、DATEDIFF;比较函数IF、IFNULL、NULLIF。内置函数广泛用于查询、存储过程、存储函数开发。

>上51CTO搜索风哥可以学习全套数据库教程

## 二、MySQL数据对象开发实战操作
>实验环境说明:两套独立主机fgedu‑net‑cn1、fgedu‑net‑cn2,硬件规格64G内存8CPU,数据路径`/fgedudb`;业务库`fgedudb`,业务用户`fgedu`,密码设置`Fg@2026db`;实验前先初始化环境,两套主机都执行下面初始化命令。
“`sql
— 创建业务数据库
CREATE DATABASE IF NOT EXISTS fgedudb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
— 创建业务用户,授权
CREATE USER IF NOT EXISTS ‘fgedu’@’%’ IDENTIFIED BY ‘Fg@2026db’;
GRANT ALL PRIVILEGES ON fgedudb.* TO ‘fgedu’@’%’;
FLUSH PRIVILEGES;
USE fgedudb;
— 创建基础测试业务表,后续所有对象基于本表操作
CREATE TABLE IF NOT EXISTS fgedu_order(
order_id BIGINT AUTO_INCREMENT COMMENT ‘订单主键ID’,
customer_id BIGINT NOT NULL COMMENT ‘客户ID’,
order_no VARCHAR(64) NOT NULL COMMENT ‘订单编号’,
order_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT ‘订单金额’,
order_status TINYINT NOT NULL COMMENT ‘订单状态’,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
remark VARCHAR(512) COMMENT ‘备注’,
PRIMARY KEY(order_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’订单业务主表’;

— 插入测试样本数据
INSERT INTO fgedu_order(customer_id,order_no,order_amount,order_status,remark)
VALUES
(10001,’ORD20260914001′,239.50,1,’正常下单’),
(10002,’ORD20260914002′,899.00,2,’已支付’),
(10003,’ORD20260914003′,120.00,0,’待支付’),
(10001,’ORD20260914004′,345.75,3,’已完成’);
“`

### 2.1 索引实战操作
#### 2.1.1 创建索引
“`sql
— 创建普通单列索引,客户查询经常按照customer_id过滤
CREATE INDEX idx_fgedu_order_customer ON fgedu_order(customer_id);

— 创建唯一索引,订单编号业务全局唯一
CREATE UNIQUE INDEX uk_fgedu_order_no ON fgedu_order(order_no);

— 创建联合复合索引,多字段联合查询场景
CREATE INDEX idx_fgedu_order_status_ctime ON fgedu_order(order_status,create_time);

— 创建全文索引,针对remark备注字段文本检索
ALTER TABLE fgedu_order ADD FULLTEXT INDEX ft_fgedu_order_remark(remark);
“`

#### 2.1.2 查询索引信息
“`sql
— 查看表全部索引,垂直格式化输出
SHOW INDEX FROM fgedu_order\G

— 通过information_schema元数据库查询索引元数据
SELECT TABLE_NAME,INDEX_NAME,NON_UNIQUE,SEQ_IN_INDEX,COLUMN_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA=’fgedudb’ AND TABLE_NAME=’fgedu_order’;

— 使用explain验证索引是否生效
EXPLAIN SELECT * FROM fgedu_order WHERE customer_id=10001;
EXPLAIN SELECT * FROM fgedu_order WHERE order_status=2 AND create_time>’2026‑01‑01 00:00:00′;
“`

#### 2.1.3 删除索引
“`sql
— 删除普通索引
DROP INDEX idx_fgedu_order_customer ON fgedu_order;

— 删除唯一索引
DROP INDEX uk_fgedu_order_no ON fgedu_order;

— 删除联合索引
ALTER TABLE fgedu_order DROP INDEX idx_fgedu_order_status_ctime;

— 删除全文索引
ALTER TABLE fgedu_order DROP INDEX ft_fgedu_order_remark;
“`

>实操提示:生产环境删除索引优先使用ALTER TABLE语法,大表删除索引尽量选择业务低峰期执行,64G内存8CPU服务器InnoDB大表DDL建议使用Online DDL模式,避免锁表影响业务。

### 2.2 约束实战操作
新建带多种约束测试表`fgedu_customer`,演示主键、唯一、非空、默认值、CHECK约束,同时演示外键约束。
“`sql
CREATE TABLE IF NOT EXISTS fgedu_customer(
cust_id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT ‘客户主键’,
cust_phone VARCHAR(20) NOT NULL COMMENT ‘手机号’,
cust_email VARCHAR(128) COMMENT ‘邮箱’,
cust_age TINYINT NOT NULL COMMENT ‘年龄’,
register_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘注册时间’,
cust_level TINYINT NOT NULL DEFAULT 1 COMMENT ‘客户等级’,
CONSTRAINT uk_cust_phone UNIQUE(cust_phone),
CONSTRAINT chk_cust_age CHECK(cust_age>=16 AND cust_age<=120),
CONSTRAINT chk_level CHECK(cust_level BETWEEN 1 AND 5)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’客户基础信息表’;

— 添加外键约束,订单表关联客户表
ALTER TABLE fgedu_order ADD COLUMN cust_fk BIGINT COMMENT ‘客户外键ID’;
ALTER TABLE fgedu_order ADD CONSTRAINT fk_order_customer FOREIGN KEY(cust_fk) REFERENCES fgedu_customer(cust_id) ON DELETE SET NULL ON UPDATE CASCADE;

— 查询表约束元数据
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=’fgedudb’ AND TABLE_NAME=’fgedu_customer’;
SELECT * FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS WHERE CONSTRAINT_SCHEMA=’fgedudb’;

— 删除外键约束(注意:删除外键不会自动删除索引,索引需要单独删除)
ALTER TABLE fgedu_order DROP FOREIGN KEY fk_order_customer;
“`

### 2.3 视图实战操作
视图封装查询:查询订单关联客户信息的业务视图。
“`sql
— 创建视图,OR REPLACE当视图已经存在直接覆盖
CREATE OR REPLACE VIEW v_fgedu_order_cust AS
SELECT
o.order_id,o.order_no,o.order_amount,o.order_status,o.create_time,
c.cust_id,c.cust_phone
FROM fgedu_order o
LEFT JOIN fgedu_customer c ON o.cust_fk = c.cust_id;

— 查询视图定义
SHOW CREATE VIEW v_fgedu_order_cust\G

— 使用视图执行查询
SELECT * FROM v_fgedu_order_cust WHERE order_status=2;

— 删除视图
DROP VIEW IF EXISTS v_fgedu_order_cust;
“`

>实操要点:视图不能创建索引;视图底层基表执行DDL变更后,视图可能失效,需要重新重建视图定义。

### 2.4 存储过程实战
MySQL存储过程编写需要修改语句结束符DELIMITER,避免存储过程体内分号提前结束语句。
“`sql
DELIMITER //
— 创建带IN输入参数存储过程:按照订单状态查询订单数量,OUT输出参数返回统计总数
CREATE PROCEDURE proc_query_order_status_count(IN p_status TINYINT,OUT p_total INT)
BEGIN
SELECT COUNT(*) INTO p_total FROM fgedu_order WHERE order_status = p_status;
END //
DELIMITER ;

— 调用存储过程,使用会话变量接收输出参数
CALL proc_query_order_status_count(2,@stat_result);
SELECT @stat_result AS status_total;

— 创建复杂业务存储过程,包含IF条件判断
DELIMITER //
CREATE PROCEDURE proc_update_order_amount(IN p_orderid BIGINT,IN p_new_amount DECIMAL(12,2))
BEGIN
IF p_new_amount >=0 THEN
UPDATE fgedu_order SET order_amount = p_new_amount WHERE order_id = p_orderid;
ELSE
SIGNAL SQLSTATE ‘45000’ SET MESSAGE_TEXT=’订单金额不能小于0′;
END IF;
END //
DELIMITER ;

— 调用存储过程更新订单金额
CALL proc_update_order_amount(1,520.00);

— 查询存储过程元信息
SHOW PROCEDURE STATUS WHERE Db=’fgedudb’\G
SHOW CREATE PROCEDURE proc_query_order_status_count\G

— 删除存储过程
DROP PROCEDURE IF EXISTS proc_query_order_status_count;
DROP PROCEDURE IF EXISTS proc_update_order_amount;
“`

### 2.5 触发器实战操作
实现审计触发器:订单数据更新时,把变更记录写入审计日志表。
“`sql
— 首先创建审计日志表
CREATE TABLE fgedu_order_log(
log_id BIGINT AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT,
old_amount DECIMAL(12,2),
new_amount DECIMAL(12,2),
operate_type VARCHAR(16),
operate_time DATETIME DEFAULT CURRENT_TIMESTAMP
)ENGINE=InnoDB;

— 创建AFTER UPDATE触发器,订单金额发生更新时记录审计日志
DELIMITER //
CREATE TRIGGER trg_order_after_update
AFTER UPDATE ON fgedu_order
FOR EACH ROW
BEGIN
IF OLD.order_amount <> NEW.order_amount THEN
INSERT INTO fgedu_order_log(order_id,old_amount,new_amount,operate_type)
VALUES(NEW.order_id,OLD.order_amount,NEW.order_amount,’UPDATE’);
END IF;
END //
DELIMITER ;

— 测试触发器,执行更新操作
UPDATE fgedu_order SET order_amount=666 WHERE order_id=1;
— 查询审计日志,确认触发器自动写入日志
SELECT * FROM fgedu_order_log;

— 查看全部触发器
SHOW TRIGGERS FROM fgedudb\G

— 删除触发器
DROP TRIGGER IF EXISTS trg_order_after_update;
“`

### 2.6 游标实战操作
在存储过程内部实现游标逐行遍历订单表数据,演示游标完整生命周期:声明‑打开‑读取‑关闭。
“`sql
DELIMITER //
CREATE PROCEDURE proc_cursor_demo()
BEGIN
— 声明变量接收游标读取字段
DECLARE v_orderid BIGINT;
DECLARE v_amount DECIMAL(12,2);
DECLARE done INT DEFAULT 0;
— 声明游标
DECLARE cur_order CURSOR FOR SELECT order_id,order_amount FROM fgedu_order WHERE order_status=2;
— 游标遍历结束设置done标记
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

OPEN cur_order;
cursor_loop:LOOP
FETCH cur_order INTO v_orderid,v_amount;
IF done=1 THEN
LEAVE cursor_loop;
END IF;
SELECT v_orderid AS oid,v_amount AS oamt;
END LOOP cursor_loop;
CLOSE cur_order;
END //
DELIMITER ;

— 调用游标存储过程
CALL proc_cursor_demo();

— 删除存储过程
DROP PROCEDURE IF EXISTS proc_cursor_demo;
“`

>实操提醒:游标适合小数据集,千万不要在千万级大表使用游标,会造成数据库性能急剧下降。

### 2.7 存储函数(自定义函数)实战
存储函数必须返回单一值,仅支持IN参数,可以直接在SELECT语句中调用。
“`sql
DELIMITER //
CREATE FUNCTION func_get_order_level(p_amount DECIMAL(12,2)) RETURNS VARCHAR(16)
DETERMINISTIC
BEGIN
DECLARE ret_level VARCHAR(16);
IF p_amount >= 800 THEN
SET ret_level=’高价值订单’;
ELSEIF p_amount >=200 THEN
SET ret_level=’普通订单’;
ELSE
SET ret_level=’小额订单’;
END IF;
RETURN ret_level;
END //
DELIMITER ;

— 在查询语句直接调用存储函数
SELECT order_id,order_no,order_amount,func_get_order_level(order_amount) AS order_tag FROM fgedu_order;

— 查看存储函数定义
SHOW CREATE FUNCTION func_get_order_level\G

— 删除自定义存储函数
DROP FUNCTION IF EXISTS func_get_order_level;
“`

### 2.8 MySQL内置函数实战演练
内置函数分为聚合函数、字符函数、转换函数、时间日期函数、比较函数,下面给出可直接执行示例:
“`sql
— 聚合函数
SELECT COUNT(*),SUM(order_amount),MAX(order_amount),MIN(order_amount),AVG(order_amount) FROM fgedu_order;

— 字符函数
SELECT CONCAT(‘订单号‑’,order_no),SUBSTRING(order_no,1,10),REPLACE(order_no,’ORD’,’NO’) FROM fgedu_order;

— 转换函数
SELECT CAST(order_amount AS UNSIGNED),CONVERT(create_time,CHAR) FROM fgedu_order;

— 时间日期函数
SELECT NOW(),CURDATE(),DATE_FORMAT(create_time,’%Y‑%m‑%d’),DATEDIFF(NOW(),create_time) FROM fgedu_order;

— 比较函数IF、IFNULL
SELECT order_id,IF(order_status=2,’已支付’,’未支付’) AS status_text,IFNULL(remark,’无备注’) FROM fgedu_order;
“`

## 三、MySQL数据库建模与逆向工程实操
### 3.1 数据库三大范式实操案例
以简易电商业务数据库建模作为实操案例:业务包含客户表、订单主表、订单明细表。
1NF第一范式:字段原子性,客户表手机号独立字段,不要存储多个手机号逗号分隔;
2NF第二范式:订单明细表主键为订单ID+商品ID联合主键,商品数量、单价完全依赖联合主键,不允许部分依赖;
3NF第三范式:订单主表存储客户ID,不存储客户姓名、手机号,客户基础信息存放客户表,消除传递依赖。

范式设计建表SQL:
“`sql
— 客户表
CREATE TABLE biz_customer(
cust_id BIGINT PRIMARY KEY AUTO_INCREMENT,
cust_name VARCHAR(64) NOT NULL,
cust_phone VARCHAR(20) NOT NULL UNIQUE,
cust_addr VARCHAR(256)
)ENGINE=InnoDB;

— 订单主表
CREATE TABLE biz_order(
order_id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(64) NOT NULL UNIQUE,
cust_id BIGINT NOT NULL,
total_amount DECIMAL(12,2),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
)ENGINE=InnoDB;

— 订单明细表(联合主键)
CREATE TABLE biz_order_item(
order_item_id BIGINT AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT NOT NULL,
goods_id BIGINT NOT NULL,
goods_num INT NOT NULL,
goods_price DECIMAL(12,2) NOT NULL
)ENGINE=InnoDB;
“`

部分业务场景允许适度反范式:报表场景,订单主表冗余客户名称,减少关联查询,牺牲存储冗余换取查询性能。

### 3.2 数据库逆向工程实操
逆向工程任务:基于已经建好的biz业务数据表,使用MySQL Workbench工具反向生成EER实体关系图,梳理表关联关系。实验连接主机为fgedu‑net‑cn1实例。

实操步骤:
1.打开MySQL Workbench,新建数据库连接,主机填写fgedu‑net‑cn1,端口3306,用户名`fgedu`,密码`Fg@2026db`,测试连通性。
2.顶部菜单栏选择`Database` → `Reverse Engineer`,打开逆向工程向导窗口。
3.选择刚刚建立好的数据库连接,点击Continue,工具自动连接数据库,抓取实例内Schema信息。
4.Schema列表勾选目标数据库`fgedudb`,点击Continue。
5.选择逆向导入对象,勾选Import MySQL Table Objects,取消不必要视图、触发器导入,勾选Place imported objects on a diagram。
6.点击Execute执行逆向解析,工具自动读取表、主键、外键约束,生成EER图,表之间自动绘制外键关联连线。
7.保存模型文件,后缀`.mwb`;通过File‑>Export可以导出PNG/PDF图片格式ER图,也可以导出SQL脚本。

逆向工程另外支持导入SQL脚本文件做反向建模,File‑>Import‑>Reverse Engineer MySQL Create Script,选择本地`.sql`建表脚本,直接生成数据模型,不需要连接数据库实例,适合拿到SQL脚本但没有数据库访问权限场景。

>实操注意:外键缺失的存量老数据库,逆向工程不会自动识别逻辑关联,只能依靠业务文档人工补充ER图关系。两套环境fgedu‑net‑cn1、fgedu‑net‑cn2完全独立,可以分别对两套实例执行逆向工程操作。

## 风哥针对本文总结
本套风哥教程完整完成MySQL数据库对象开发、SQL编程、数据库建模全部实操,包含索引、约束、视图、存储过程、触发器、游标、存储函数、内置函数、三大范式、逆向工程全部知识点。

索引、约束保障查询性能与数据完整性;视图简化查询逻辑,做权限隔离;存储过程、触发器、游标实现数据库端业务逻辑封装,在生产中要权衡使用,触发器、游标不要用于大数据量业务,避免性能风险;存储函数和存储过程语法相近,但是返回值、事务支持存在明显差异,开发时需要合理选型。

数据库建模优先遵循三大范式,同时结合业务性能需求适度反范式;逆向工程是梳理存量业务数据库的重要手段,DBA接手旧系统优先做逆向工程梳理ER模型。所有实操均基于64G内存8CPU两套独立主机fgedu‑net‑cn1、fgedu‑net‑cn2完成,路径统一为`/fgedudb`,库名用户名统一为`fgedudb`、`fgedu`,读者可以直接复现全部SQL命令。

生产环境上线数据库对象,禁止直接在线上环境调试,优先在测试主机完成功能、压力验证;大表DDL操作避开业务高峰;无用索引、废弃存储过程、触发器需要定期清理,维护数据库对象整洁,降低故障风险。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息