一套系统的两个数据库合并经历以及反思
缘由
一个客户有两个工厂(总部和分厂),使用的是同样的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,然后再插入到总部的考勤明细表
一些反思
-
表的ID换成Guid,因为使用Guid就不会存在重复的情况,在数据库合并时就直接合并就好,可以方便很多
-
例如人事档案表 Employee的ID
- 职位表、职级表等不使用编码,直接使用Guid,就不存在重复编码,名称重复的使用转换,根据名称获取编码,然后删除重复部分名称的记录
-
- 分区表
- 打卡记录表可以使用分区表功能,打卡时间按年来分区。因为打卡记录都是按照时间顺序存储的。
作者:日积月累码农
如有错误,欢迎您指出。
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面给出原文链接,否则保留追究法律责任的权利。
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面给出原文链接,否则保留追究法律责任的权利。