• mysql使用模板解决旧数据处理,默认初始化数据的通用方法!


    一 业务介绍

    先来看看我这得大致业务需求,这次业务比较简单:

    即从现在开始,每次new一个爷爷都需要默认初始化给这个爷爷三个儿子(子表,爷爷id去关联),并在初始化每个儿子的同时再给每个儿子初始化若干个孙子(爸爸表的子表,爸爸id关联),

    这么说可能比较绕,综艺就是在爷爷表插入一条数据的同时,往父表插入固定的几条记录,然后往父表插入每条记录的同时再往儿子表插入固定的记录,之间都是用主键关联,表名分别是:

    爷爷 :   pm_project

    爸爸:    pm_role      (project_id  关联爷爷)

    儿子:    pm_role_app    ()role_id 关联爸爸,同时project_id再关联爷爷)

    需要new的儿子的模板表:pm_project_app_filter, 因为业务需要,孙子模板放在单独的表中,爸爸模板放在自己表中,爷爷id设为-1.

    二   初始化父表

    我们先不考虑java在新建爷爷时的处理方式,来看旧爷爷的处理.

    首先准备爸爸的模板,即new一个爷爷时,需要初始化爸爸是几个,分别有什么具体要求,那么可以直接在爸爸表里建立业务需要的模板,只需要将爷爷id设置为-1即可:

    如图,有了这三个模板之后,我们就可以先给每个旧的爷爷三个他们的儿子,这里采用笛卡尔积批量插入处理:

    insert into pm_role (id,role_code,role_name,project_id,is_del)
    (select
    lpad(UUID_SHORT(),32,UUID_SHORT()),
    t2.role_code,
    t2.role_name,
    t1.id,
    t2.is_del
    FROM pm_project t1,pm_role t2 where t2.project_id="-1");

    即关联爷爷和爸爸表,然后筛选出爷爷id=-1的三个模板儿子,与爷爷表中每个爷爷产生笛卡尔积,给每个爷爷三个儿子,完成,注意,

    这里主键采用lpad函数,不建议使用UUID,原因是有的mysql引擎性能如果过于强大就会报错,因为速度太快,造成主键重复,来不及随机

    三 初始化子表

    再来看孙子表中需要的模板,处于特殊业务需求,这里孙子表的某个字段需要的数据采用另一张表的模板存储:

    即孙子表每个孙子都需要一个app_id,也就是说,每个爸爸有三个不同app_id的儿子,这个根据业务可以随意调整,然后初始化:

    insert into pm_role_app(
    id,
    project_id,
    role_id,
    app_id,
    data_scope
    )
    select
    lpad(UUID_SHORT(),32,UUID_SHORT()),
    t1.project_id,
    t1.id,
    t2.app_id,
    case when t2.app_id="46d577d4dcb344b583e7254dee3d6dba" then 3 else 1 END

    FROM pm_role t1,pm_project_app_filter t2 where t1.project_id!="-1";

    这时候关联爸爸表和这个模板表,并排除爸爸表中的模板 ,然后给每个爸爸都生成三个带有模板app_id的儿子,就可以了,这里也采用批量插入.

     四  新建爷爷时处理的逻辑

    这里主要就是按照业务写代码就可以了,没什么要说的,直接贴代码:

    保存爷爷:

    dao.save(pMProject);
    pmRoleService.init(pMProject.getId());//用爷爷id,保存三个爸爸

    保存爸爸:

    保存儿子:

    ,

    这样,以后如果要多的每次需要多的儿子或者爸爸,只需要在模板表中添加一条记录,或者在常量类中多配置一个爸爸模板即可,便于后期维护扩展,sql的初始化语句也可以通用!

  • 相关阅读:
    YGC问题排查,又让我涨姿势了!
    AI时代,还不了解大数据?
    实战篇:一个核心系统 3 万行代码的重构之旅
    监控系统选型,这篇不可不读!
    实时离线一体大数据在资产租赁saas服务中使用
    基于监控服务打造微服务治理生态体系
    CDH6.3.2升级Hive到4.0.0
    强化学习 9 —— DQN 改进算法DDQN、Dueling DQN tensorflow 2.0 实现
    强化学习 8 —— DQN 算法 Tensorflow 2.0 实现
    强化学习 7——Deep Q-Learning(DQN)公式推导
  • 原文地址:https://www.cnblogs.com/houzheng/p/8807147.html
Copyright © 2020-2023  润新知