先讲讲做这个事情的的原因,本人经历过很多家公司,虽然大公司没去过,但是3-5个研发到百来号研发的中小型公司,或者传统公司到互联网公司均都待过,让人感触比较深刻的一个问题就是数据库文档的管理方式:
- 使用word文档进行维护
- 使用powerdesigner维护
- 在代码中维护或使用sql审核工具如archerry,并且使用pd做反向工程
以上几种情况都过多依赖于开发人员的自主能动性,时间一久必然出现各种问题,比如 - 1、word文档维护,可能到后面就变得乱七八糟的,自然而然就丢弃掉了。
- 2、使用powerdesigner也是一样的你可以通过它进行建模,但是,后续的产品高频迭代更新,最后也会导致与实际库表结构完全不一样,最后还是丢弃掉。
- 3、第三种方式比较可取,但是同样不够直观,因为它照样没办法维护关系。也仅仅解决了迭代上线的审核问题。
另外在目前敏捷开发以及微服务化的时代,对库表设计的灵活性要求下,所谓的表约束情况越来越多不被使用或者无法使用,那么一个数据库表关系管理的平台越来越被需要。那么此平台需要提供哪些功能用于解决哪些痛点问题呢?
- 1、平台需提供环境管理使得提交的变更能够很快的区分出哪些环境已执行哪些环境未执行。
- 2、平台需提供抽象的关系维护,例如我一张用户表中的user_id这个字段被哪些库哪些表进行了关联,并且能生成一张全景视图。
- 3、平台需要提供建模功能,使得开发人员库表建模全部在平台上进行。
- 4、平台需要提供权限管理功能,只有特定人员可以审核sql执行,普通开发只有提交权限。
- 5、平台需要提供sql规范定义功能,例如commen必须填写,表必须使用自增id等,可灵活自定义。
- 6、平台需要提供代码生成功能,便于建模完成之后可以直接生成各种代码,此处可以设计成插件模式,这样便于不同语言自行编写扩展包。
当然还有很多常规性的功能这里就不一一列举。
有了这样一个平台,就能将一家企业最基础的库表管理起来,好处之多不言而喻。方便了dba对数据库的管理,方便了开发人员对能够快速的通过查看全景图知道业务是什么样的,并且能够帮助开发人员快速的构建起代码。也能规范开发人员的表结构设计,而不是通过约定。
但是表间关系是很复杂的图状结构,而neo4j就是可以很好的存储一样一种图状结构的数据库。那么如何将表间关系使用neo4j数据结构进行建模呢?
neo4j的概念是节点、关系、属性一个模型即为最小单位的数据。用来表示数据库的元数据即列,也就是数据库中的每一个column为neo4j的一个节点则这个节点含有的属性即为 列所有的属性,表也作为它的一个属性,库也作为它的一个属性,而列于列的关系即为mysql中的表间关系。有了以上概念我们就来建模,我有一个权限管理系统的库如下:
/*
Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50733
Source Host : localhost:3306
Source Schema : db_user
Target Server Type : MySQL
Target Server Version : 50733
File Encoding : 65001
Date: 06/02/2021 14:39:49
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_author
-- ----------------------------
DROP TABLE IF EXISTS `t_author`;
CREATE TABLE `t_author` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`role_id` int(11) NULL DEFAULT NULL COMMENT '角色id',
`resource_id` int(11) NULL DEFAULT NULL COMMENT '资源id(根据资源类型判断是按钮还是菜单)',
`resource_type` int(2) NULL DEFAULT 0 COMMENT '资源类型(0菜单,1按钮)',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for t_department
-- ----------------------------
DROP TABLE IF EXISTS `t_department`;
CREATE TABLE `t_department` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '部门ID',
`department_name` varchar(56) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门名称',
`parent_id` int(11) NULL DEFAULT NULL COMMENT '上级部门id',
`level` int(2) NULL DEFAULT 1 COMMENT '部门等级',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for t_menu
-- ----------------------------
DROP TABLE IF EXISTS `t_menu`;
CREATE TABLE `t_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单id',
`menu_name` varchar(56) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单名称',
`menu_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单url',
`parent_id` int(11) NULL DEFAULT NULL COMMENT '父菜单id',
`level` int(2) NULL DEFAULT 1 COMMENT '菜单级别(一级菜单,二级菜单,三级菜单)',
`menu_status` int(1) NULL DEFAULT 0 COMMENT '菜单状态(1启用,0禁用)',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for t_operation
-- ----------------------------
DROP TABLE IF EXISTS `t_operation`;
CREATE TABLE `t_operation` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '按钮id',
`btn_code` varchar(56) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '按钮编号',
`btn_name` varchar(56) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '按钮名称',
`btn_title` varchar(56) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '按钮标题',
`menu_id` int(11) NULL DEFAULT NULL COMMENT '菜单id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '按钮表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for t_role
-- ----------------------------
DROP TABLE IF EXISTS `t_role`;
CREATE TABLE `t_role` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色id',
`role_name` varchar(56) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色名称',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`login_time` datetime(0) NULL DEFAULT NULL COMMENT '登录时间',
`name` varchar(56) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名称',
`login_name` varchar(56) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录名称',
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录密码',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
`user_status` int(2) NULL DEFAULT 1 COMMENT '用户状态(0禁用,1启用)',
`department_id` int(11) NULL DEFAULT NULL COMMENT '部门id',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`create_user` datetime(0) NULL DEFAULT NULL COMMENT '创建人',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
`update_user` datetime(0) NULL DEFAULT NULL COMMENT '更新人员',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for t_user_role
-- ----------------------------
DROP TABLE IF EXISTS `t_user_role`;
CREATE TABLE `t_user_role` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`role_id` int(11) NOT NULL COMMENT '角色id',
`user_id` int(11) NOT NULL COMMENT '用户id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户角色关系表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
根据以上表结构我们可以建模如下:ColumnBean.java
使用sql字段信息并导出为json
select * from information_schema.columns where table_schema = 'db_user' and table_name = 't_user';
json文件文件比较长我就截取一个节点信息。
{
"RECORDS": [
{
"TABLE_CATALOG": "def",
"TABLE_SCHEMA": "db_user",
"TABLE_NAME": "t_user",
"COLUMN_NAME": "id",
"ORDINAL_POSITION": "1",
"COLUMN_DEFAULT": "",
"IS_NULLABLE": "NO",
"DATA_TYPE": "int",
"CHARACTER_MAXIMUM_LENGTH": "",
"CHARACTER_OCTET_LENGTH": "",
"NUMERIC_PRECISION": "10",
"NUMERIC_SCALE": "0",
"DATETIME_PRECISION": "",
"CHARACTER_SET_NAME": "",
"COLLATION_NAME": "",
"COLUMN_TYPE": "int(11)",
"COLUMN_KEY": "PRI",
"EXTRA": "auto_increment",
"PRIVILEGES": "select,insert,update,references",
"COLUMN_COMMENT": "用户ID",
"GENERATION_EXPRESSION": ""
}
]
}
使用idea中Gsonfomat插件生成实体ColumnEntity.java,在稍微做下转换最后长成下面模样
package com.example.demo.neo4j.entity;
/**
* @Description TODO
* @Author 姚仲杰#80998699
* @Date 2021/2/6 14:47
*/
public class ColumnEntity {
private String tableCatalog;
private String tableSchema;
private String tableName;
private String columnName;
private String ordinalPosition;
private String columnDefault;
private String isNullable;
private String dataType;
private String characterMaximumLength;
private String characterOctetLength;
private String numericPrecision;
private String numericScale;
private String datetimePrecision;
private String characterSetName;
private String collationName;
private String columnType;
private String columnKey;
private String extra;
private String privileges;
private String columnComment;
private String generationExpression;
//...省略getter/setter
}