一文教你快速生成MySQL数据库关系图


Posted in Redis onJune 28, 2022

需求描述:

在公司老旧系统里,数据库表很多,但是在设计之初并没有建立好关系图,导致新人刚入职,面对N个库,每个库几百张表,很不方便。

例如:公司某一个系统的库有三百张表,在不熟悉项目的情况下,打开数据库看到一列列的表,很不清晰,对新入职同事很不友好。

一文教你快速生成MySQL数据库关系图

需求分析:

我们一个系统里,可能有很多个模块,例如商城系统中有商品模块、券模块、店铺模块等,没个模块都有几十张表,每个模块需要生成如下关系图:(吐槽一下,Navicat逆向的图没PowerDesigner好看)

一文教你快速生成MySQL数据库关系图

技术方案:

使用工具:Navicat

        Navicat是国内的一款数据库客户端,内置有模型功能,可以实现需求中,选中一个模块的所有表,逆向表到模型,从而生成ER图,但如果选中表中,没有外键关联,生成出来的模型,并没有像需求中那样,有直观的线连接,所以需要给对应表生成外键SQL。

        从Navicat中选中所有表导出为SQL时发现下图规律

一文教你快速生成MySQL数据库关系图

解决方案:

1. 把每个表语句拆分出来

2. 主表与关联表,主表不需要生产外键,关联表可以通过小撇号判断是否需要外键

3. 说再多文字不如读一遍代码更清晰

package com.example.demo;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
 
public class MysqlERGenerate {
    public static void main(String[] args) throws IOException {
        StringBuilder builder = new StringBuilder();
        // 输入从Navicat导出的表结构sql文件 将文件读取出来 放入字符串中
        InputStream is = Files.newInputStream(Paths.get("C:\\Users\\admin\\Desktop\\ddl.sql"));
        String line;
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        line = reader.readLine();
        while (line != null) {
            builder.append(line);
            builder.append("\n");
            line = reader.readLine();
        }
        reader.close();
        is.close();
        String sql = builder.toString();
 
        // 按照规律 使用CREATE TABLE进行分割 并删掉一个文件注释部分
        String[] split = sql.split("CREATE TABLE");
        List<String> list = new ArrayList<>(Arrays.asList(split));
        list.remove(0);
        // 使用开头两个小撇号进行截取 得到表名 转为Map<表名, SQL>
        Map<String, String> collect = list.stream().collect(Collectors.toMap(k -> {
            int firstIndex = k.indexOf("`");
            return k.substring(++firstIndex, k.indexOf("`", firstIndex));
        }, v -> v));
 
        // 需要创建外键的字段与对应的主表名称 Map<外键名, 外键主表名>
        Map<String, String> foreignKey = new HashMap<>();
        foreignKey.put("ticket_no", "ticket");
        foreignKey.put("ticket_define_no", "ticket_define");
        foreignKey.put("pro_no", "pro_main");
        // 循环判断,生成外键SQL
        Set<String> foreignKeyFields = foreignKey.keySet();
        for (String mainTableName : collect.keySet()) {
            String val = collect.get(mainTableName);
            for (String field : foreignKeyFields) {
                if (!mainTableName.equals(foreignKey.get(field)) && val.indexOf("`" + field + "`") > 0) {
                    String createForeignKeySql = String.format("alter table %s add foreign key %s(%s) references %s(%s);", mainTableName, mainTableName + field + System.currentTimeMillis(), field, foreignKey.get(field), field);
                    System.out.println(createForeignKeySql);
                }
            }
        }
    }
}

运行效果:只复制出部分,实际远比这个多

alter table pro_param add foreign key pro_parampro_no1650765563395(pro_no) references pro_main(pro_no);
alter table pro_shop_priority_his_20200805 add foreign key pro_shop_priority_his_20200805pro_no1650765563423(pro_no) references pro_main(pro_no);
 
alter table ticket_define_shop add foreign key ticket_define_shopticket_define_no1650765563423(ticket_define_no) references ticket_define(ticket_define_no);
alter table ticket_define_item add foreign key ticket_define_itemticket_define_no1650765563425(ticket_define_no) references ticket_define(ticket_define_no);
 
alter table ticket_his_2019 add foreign key ticket_his_2019ticket_no1650765563432(ticket_no) references ticket(ticket_no);
alter table ticket_his_2018 add foreign key ticket_his_2018ticket_no1650765563433(ticket_no) references ticket(ticket_no);

一文教你快速生成MySQL数据库关系图

  • 外键语句不要去开发测试生产等环境执行,要自己在本地新建库
  • 新建库时,只转结构就好,不然数据多了,外键语句执行特慢
  • 结束后,想要那些表之间的关系图,只需要选中后逆向表到模型即可得到需求中的效果
  • 如果资金充裕,可以打赏请我喝杯咖啡,谢谢 Thanks♪(・ω・)ノ

总结

到此这篇关于快速生成MySQL数据库关系图的文章就介绍到这了,更多相关生成MySQL关系图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
使用Redis实现秒杀功能的简单方法
May 08 Redis
redis内存空间效率问题的深入探究
May 17 Redis
Java Socket实现Redis客户端的详细说明
May 26 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
聊聊redis-dump工具安装问题
Jan 18 Redis
解决linux下redis数据库overcommit_memory问题
Feb 24 Redis
源码分析Redis中 set 和 sorted set 的使用方法
Mar 22 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
浅谈Redis变慢的原因及排查方法
Jun 21 Redis
redis protocol通信协议及使用详解
Jul 15 Redis
Redis实现主从复制方式(Master&Slave)
Jun 21 #Redis
浅谈Redis变慢的原因及排查方法
使用Redis实现分布式锁的方法
Jun 16 #Redis
关于Redis的主从复制及哨兵问题
Jun 16 #Redis
Redis实现分布式锁的五种方法详解
Redis实现短信验证码登录的示例代码
Jun 14 #Redis
Redis批量生成数据的实现
Jun 05 #Redis
You might like
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
jQuery 事件队列调整方法
2009/09/18 Javascript
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
2020/02/07 Javascript
九步学会Python装饰器
2015/05/09 Python
python Opencv将图片转为字符画
2021/02/19 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
tensorflow自定义激活函数实例
2020/02/04 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
公司会计主管岗位责任制
2014/03/01 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
保险内勤岗位职责
2014/04/05 职场文书
委托公证书
2014/04/08 职场文书
写字楼租赁意向书
2014/07/30 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
SQL注入篇学习之盲注/宽字节注入
2022/03/03 MySQL
Go 中的空白标识符下划线
2022/03/25 Golang