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

目录
  • 需求描述:
  • 需求分析:
  • 技术方案:
  • 解决方案:
  • 总结

需求描述:

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

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

需求分析:

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

技术方案:

使用工具:Navicat

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

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

解决方案:

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);

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

总结

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

(0)

相关推荐

  • 如何用workbench导出mysql数据库关系图

    1. 打开mysql workbench,选择首页中间"Data Modeling"下方的第二栏"Create EER Model From Existing Database";2. 在"Stored Connection"里选择"Manage Stored Connections...";3. 在Manage DB Connections里选择"New"新建连接,并在左侧输入框里填好想连接的数据库信息;

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

    目录 需求描述: 需求分析: 技术方案: 解决方案: 总结 需求描述: 在公司老旧系统里,数据库表很多,但是在设计之初并没有建立好关系图,导致新人刚入职,面对N个库,每个库几百张表,很不方便. 例如:公司某一个系统的库有三百张表,在不熟悉项目的情况下,打开数据库看到一列列的表,很不清晰,对新入职同事很不友好. 需求分析: 我们一个系统里,可能有很多个模块,例如商城系统中有商品模块.券模块.店铺模块等,没个模块都有几十张表,每个模块需要生成如下关系图:(吐槽一下,Navicat逆向的图没Power

  • 用python生成mysql数据库结构文档

    最近因为项目原因需要编写数据库设计文档,但是由于数据表太多,手动编写耗费的时间太久,所以搞了一个简单的脚本快速生成数据库结构,保存到word文档中. 安装pymysql和document pip install pymysql pip install document 脚本 # -*- coding: utf-8 -*- import pymysql from docx import Document from docx.shared import Pt from docx.oxml.ns im

  • nodejs环境快速操作mysql数据库的方法详解

    github地址https://github.com/dmhsq/dmhsq-mysql-db 可用于腾讯云SCF以及云开发环境 错误处理尚未完善 错误参考mysql错误 引入依赖包 npm install dmhsq-mysql-db 效果如下 简化了mysql的使用 安装依赖 npm install dmhsq-mysql-db 使用示例 快速操作mysql 错误处理尚未完善 部分错误参考mysql错误 引入资源 const database = require("dmhsq-mysql-d

  • 学会sql数据库关系图(Petshop)

    很久以前就知道微软的Petshop的很经典,昨天抽出时间去学习,一开始还真的不适应,什么成员资格,还真的看不太懂,运行petshop想从登陆学起,但是用户名和密码都不知道,后来发现有更注册的页面,自己注册了一个页面,才发现还得从数据库出发.花了这么多时间最终还是回到了数据库,但是数据库中一张一张的表格找不到脚本,也不是自己设计的数据库,完全没有一点头绪,后来突然想起来sql有个数据库关系图,可以很快的适合数据库程序员很快的掌握数据库表之间的关系.于是开始了我的百度之旅,关于数据库的关系图的文章还

  • 卸载VS2011 Developer Preview后Sql Server2008 R2建立数据库关系图报“找不到指定的模块”错误的解决方法

    可怜我的C盘本来只有8.XG,所以不得不卸载掉它. 卸载掉本身没啥问题,只是昨晚突然发现 Sql Server 2008 R2 Management Studio 突然不能新建数据库关系图了,一建立就会报"找不到指定的模块(MS Visual Database Tools)"的错误: 为了这个错误我甚至认真评估了重新配置数据库的可能性.无奈这个R2的SQL2008打过SP1了,无论是修复还是重装都是很花时间的事情,所以不甘心,在Google上找了一圈.终于找到个类似的主题反应了这个问题

  • 此数据库没有有效所有者,因此无法安装数据库关系图支持对象

    在新建数据库或附加数据库后,想添加关系表,结果出现下面的错误: 此数据库没有有效所有者,因此无法安装数据库关系图支持对象.若要继续,请首先使用"数据库属性"对话框的"文件"页或ALTER AUTHORIZATION语句将数据库所有者设置为有效登录名,然后再添加数据库关系图支持对象. 按照第一种方式更改怎么也不行,并且文件的所有者也是sa.网友给出了一种方法,运行以下命令: ALTER AUTHORIZATION ON database::mydbname TO sa

  • Shell下实现免密码快速登陆MySQL数据库的方法

    背景 当我们在 Shell 下想要通过 mysql-client 登陆到 MySQL 数据库的时候,我们总是需要非常麻烦的输入一次又一次的密码. 而且,如果你的 root 密码是高度随机的话(LastPass大法好),那么你登陆一次 MySQL 数据库的成本就会非常大了. 通常我们登陆数据库的时候都是这样登陆的,如下 root@imlonghao:~# mysql -uroot -p Enter password: 那么,有没有一个办法能够既安全,又能简单方便地登陆到数据库去呢? 方法 答案当然

  • 安全快速修改Mysql数据库名的5种方法

    1. RENAME DATABASE db_name TO new_db_name这个..这个语法在mysql 5.1.7中被添加进来,到了5.1.23又去掉了.据说有可能丢失数据.还是不要用的好.详见: http://dev.mysql.com/doc/refman/5.1/en/rename-database.html 2.如果所有表都是MyISAM类型的话,可以改文件夹的名字关闭mysqld把data目录中的db_name目录重命名为new_db_name开启mysqld 3.重命名所有的

  • 快速增加MYSQL数据库连接数负载能力的方法分享

    第一先限制Innodb的并发处理.如果innodb_thread_concurrency = 0 可以先改成 16或是64 看机器压力,如果非常大,先改成16让机器的压力下来,然后慢慢增达,适应自已的业务.处理方法: set global innodb_thread_concurrency=16; 方法一: (window系统中可直接修改my.ini文件) 进入MYSQL安装目录 打开MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_

随机推荐