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

缘由

一个客户有两个工厂(总部和分厂),使用的是同样的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. 打卡记录表可以使用分区表功能,打卡时间按年来分区。因为打卡记录都是按照时间顺序存储的。
原文地址:https://www.cnblogs.com/qingyunye/p/14221135.html