• 一套系统的两个数据库合并经历以及反思


    缘由

    一个客户有两个工厂(总部和分厂),使用的是同样的eHR系统(Electronic Human Resources),两个工厂的eHR系统分别用了3年多。

    因为多种原因,两个工厂合并成一个,员工也合并在一起,所以2个HR系统也要合并成一个HR系统,其实就是把2个数据库合并成一个,数据必须保证正常使用。

    数据库设置

    使用的数据库是SQL Server,相关表设置如下:

    人事档案表  Employee

    ID:自增ID,该ID贯穿整个考勤系统,例如:人事异动记录、奖惩记录、考勤打卡记录、考勤明细表、考勤汇总表、调薪记录、薪资结果表等

    Code:工号

    Name:姓名

    Department:部门编码,Department 表中的Code

    Position:职位编码,Position 表中的Code

    部门表  Department

    Code:部门编码

    Name:部门名称

    TreeLevel:级别

    UpCode:上级部门编码

    职位表  Position 

    Code:职位编码

    Name:职位名称

    考勤明细表 AttendanceDetail

    Hdate:考勤日期

    EmployeeID:人事档案表ID

    合并问题以及解决思路

    初步一看合并很简单,如果重复的时候使用转换一下就好,但是实际情况会很复杂,工作量也很大,具体要根据实际情况来处理,见招拆招。不过使用过的sql脚本保存起来,下次碰到合并可以直接复用,下面是简单记录

    首先备份数据库(最重要)

    部门合并

    因为有4个核心字段,所以不能随便合并,而且存在编码重复或者名称重复的情况,而且离职的人比较多,重复的部门编码也多

    • 最后和客户商量,离职的部门都不要了,只要合并在职的部门就好,删除离职部门前,把离职时的部门记录在人事档案表的备注中
    • 在职部门编码重复的就不多了,手工添加重复编码的部门,然后给重复部门编码的人员重新分配部门
    • 在职重复名称的部门,要删掉重复名称的部门,然后给重复部门编码的人员重新分配部门

    职位、职级等合并

    职位名称重复的:

    • 在分厂职位表中增加字段NewCode,根据职位名称从总部职位中获取职位编码NewCode,然后分厂人事档案表的职位字段Position更新为NewCode
    • 然后删除职位名称重复的记录,不用插入到总部职位表中

    职位编码重复的:

    • 手工在NewCode字段中写入新的职位编码,然后插入总部时使用NewCode作为部门编码
    • 人事档案表的职位字段Position更新为NewCode

    不存在的部门编码:

    • 直接插入到总部的职位表中就好

    人事档案合并后

    所有使用过EmployeeID的表都要更新为合并后的EmployeeID,例如考勤明细表、异动记录表、薪资表等,步骤如下:

    • 把分厂的人事档案表记录插入到总部的人事档案表,这在分厂的人员就有了合并后的ID,然后在分厂的人事表中增加一个合并后的ID,NewID。
    • 分厂中勤明细表、异动记录表、薪资等表的EmployeeID都更新为NewID,然后在插入到总部的数据库中,这样历史数据就能正常查询了

    考勤明细表合并

    • 分厂数据库的考勤明细表的EmployeeID根据更新为人事表的NewID,然后再插入到总部的考勤明细表

    一些反思

    1. 表的ID换成Guid,因为使用Guid就不会存在重复的情况,在数据库合并时就直接合并就好,可以方便很多

      1. 例如人事档案表 Employee的ID

      2. 职位表、职级表等不使用编码,直接使用Guid,就不存在重复编码,名称重复的使用转换,根据名称获取编码,然后删除重复部分名称的记录
    2. 分区表
      1. 打卡记录表可以使用分区表功能,打卡时间按年来分区。因为打卡记录都是按照时间顺序存储的。
  • 相关阅读:
    RAC连接时的2种方式Connect Time Failver和taf
    ElasticSearch Root身份运行
    sql in按照指定顺序排序
    JAVA字符串格式化-String.format()的使用
    java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cookie
    全文搜索引擎 Elasticsearch 入门教程
    监控页面后退前进,浏览器文档加载事件之pageshow、pagehide
    ios 上浏览器返回上一页不会刷新页面问题,页面初始化的方法不执行
    SQL之case when then用法
    MySQL表的四种分区类型
  • 原文地址:https://www.cnblogs.com/qingyunye/p/14221135.html
Copyright © 2020-2023  润新知