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

举报
风哥数据库教程 发表于 2026/09/14 09:32:33 2026/09/14
【摘要】 数据库教程FGMT36‑MySQL数据对象开发及数据库建模设计 前言在企业级MySQL运维与数据库开发工作中,仅仅掌握基础增删改查SQL不足以支撑复杂业务系统落地。数据库对象开发、规范化数据建模是DBA、运维工程师、后端开发人员必须掌握的核心能力。本套风哥教程围绕索引、约束、视图、存储过程、触发器、游标、自定义函数、数据库范式与逆向工程展开,面向IT运维、DBA、云计算、软件开发从业人员,完...

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

前言

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

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

本套风哥教程知识结构分为两大模块,第一模块为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;实验前先初始化环境,两套主机都执行下面初始化命令。

-- 创建业务数据库
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 创建索引

-- 创建普通单列索引,客户查询经常按照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 查询索引信息

-- 查看表全部索引,垂直格式化输出
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 删除索引

-- 删除普通索引
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约束,同时演示外键约束。

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 视图实战操作

视图封装查询:查询订单关联客户信息的业务视图。

-- 创建视图,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,避免存储过程体内分号提前结束语句。

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 触发器实战操作

实现审计触发器:订单数据更新时,把变更记录写入审计日志表。

-- 首先创建审计日志表
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 游标实战操作

在存储过程内部实现游标逐行遍历订单表数据,演示游标完整生命周期:声明‑打开‑读取‑关闭。

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语句中调用。

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内置函数实战演练

内置函数分为聚合函数、字符函数、转换函数、时间日期函数、比较函数,下面给出可直接执行示例:

-- 聚合函数
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:

-- 客户表
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.顶部菜单栏选择DatabaseReverse 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,库名用户名统一为fgedudbfgedu,读者可以直接复现全部SQL命令。

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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。