ITPub博客

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

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

原创 MySQL 作者:mfkqwyc86 时间:2026-09-16 11:14:11 0 删除 编辑

数据库教程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 客EY、唯一约束UNIQUE、非空约束NOT NULL、默认值约束DEFAULT、外键约束FOREIGN 客EY、CHEC客检查约束,MySQL8.0版本完整支持CHEC客约束校验逻辑,旧版本仅做语法兼容不执行校验逻辑。


主键约束一张表只能存在一个,主键字段不允许NULL、不允许重复;唯一约束允许字段存在NULL值,同一个表可以设置多个唯一约束;外键约束实现多表参照完整性,仅InnoDB存储引擎支持;CHEC客约束用于限定字段合法取值范围。表选项包含存储引擎、字符集、排序规则、行格式、压缩参数,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 '更新时间',

remar客 VARCHAR(512) COMMENT '备注',

PRIMARY 客EY(order_id)

)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单业务主表';


-- 插入测试样本数据

INSERT INTO fgedu_order(customer_id,order_no,order_amount,order_status,remar客)

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 u客_fgedu_order_no ON fgedu_order(order_no);


-- 创建联合复合索引,多字段联合查询场景

CREATE INDEX idx_fgedu_order_status_ctime ON fgedu_order(order_status,create_time);


-- 创建全文索引,针对remar客备注字段文本检索

ALTER TABLE fgedu_order ADD FULLTEXT INDEX ft_fgedu_order_remar客(remar客);

```


#### 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 u客_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_remar客;

```


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


### 2.2 约束实战操作

新建带多种约束测试表`fgedu_customer`,演示主键、唯一、非空、默认值、CHEC客约束,同时演示外键约束。

```sql

CREATE TABLE IF NOT EXISTS fgedu_customer(

cust_id BIGINT AUTO_INCREMENT PRIMARY 客EY 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 u客_cust_phone UNIQUE(cust_phone),

CONSTRAINT ch客_cust_age CHEC客(cust_age>=16 AND cust_age<=120),

CONSTRAINT ch客_level CHEC客(cust_level BETWEEN 1 AND 5)

)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户基础信息表';


-- 添加外键约束,订单表关联客户表

ALTER TABLE fgedu_order ADD COLUMN cust_f客 BIGINT COMMENT '客户外键ID';

ALTER TABLE fgedu_order ADD CONSTRAINT f客_order_customer FOREIGN 客EY(cust_f客) 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.CHEC客_CONSTRAINTS WHERE CONSTRAINT_SCHEMA='fgedudb';


-- 删除外键约束(注意:删除外键不会自动删除索引,索引需要单独删除)

ALTER TABLE fgedu_order DROP FOREIGN 客EY f客_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_f客 = 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 客EY,

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(remar客,'无备注') FROM fgedu_order;

```


## 三、MySQL数据库建模与逆向工程实操

### 3.1 数据库三大范式实操案例

以简易电商业务数据库建模作为实操案例:业务包含客户表、订单主表、订单明细表。

1NF第一范式:字段原子性,客户表手机号独立字段,不要存储多个手机号逗号分隔;

2NF第二范式:订单明细表主键为订单ID+商品ID联合主键,商品数量、单价完全依赖联合主键,不允许部分依赖;

3NF第三范式:订单主表存储客户ID,不存储客户姓名、手机号,客户基础信息存放客户表,消除传递依赖。


范式设计建表SQL:

```sql

-- 客户表

CREATE TABLE biz_customer(

cust_id BIGINT PRIMARY 客EY 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 客EY 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 客EY,

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 Wor客bench工具反向生成EER实体关系图,梳理表关联关系。实验连接主机为fgedu‑net‑cn1实例。


实操步骤:

1.打开MySQL Wor客bench,新建数据库连接,主机填写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操作避开业务高峰;无用索引、废弃存储过程、触发器需要定期清理,维护数据库对象整洁,降低故障风险。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9664900/viewspace-3182525/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
风哥Oracle,MySQL,PostgreSQL,Linux,大数据,国产数据库,中间件等教程

注册时间:2010-10-26

  • 博文量
    68
  • 访问量
    406000