1、需求
某音乐学院的教学用房预约系统(以下简称系统),2017年完成,当时系统用到的机构信息学校没有统一的数据,所以只能在系统内部进行管理,于是系统设计了两个表格,分别管理机构信息(院系信息),和登录用户信息,基本的表结构如下所示:
--jsgl_dept 部门表,只考虑了一级结构的部门,没有做树状结构
dept_id //部门id,自增字段
dept_code //部门编号
dept_name //部门名称
--jsgl_user 用户信息表
user_id
user_name
dept_id //用户所属部门
考虑到将来很可能学校会进行数据治理,该系统的部门信息肯定需要从数据中心系统中通过各种方式获取,所以系统中所有的部门引用均使用dept_id,这个部门主键,该主键是典型的无意义主键,跟业务部相关,仅在该系统内部有效,系统内部其他表引用的部门信息均使用这个dept_id。部门编号字段仅仅用来标识部门。
2、机构信息数据同步的实现
果然,2021年,学校进行数据治理,各个应用系统中的公共数据都需要从数据中心读取。其他数据已经实现,下面记录一下部门信息以及人员和部门的关系数据是如果在不修改程序的基础上进行的数据同步操作。
由于教学用房预约系统和中心数据库都是基于oracle数据,所以直接在教学用房预约系统中做了一个Database links(数据库连接),然后做了一个Synonyms(同义词),直接将中心数据库中的部门表视图(RS_JGXX)和人员信息(RS_JBXX)引入系统。
由于仅仅是关心所有用用户的部门信息,所以系统就首先在人员信息表筛取部门信息。
select "单位代码","单位" from RS_JBXX where "单位代码" is not null group by "单位代码","单位"
jsgl_dept表的“单位编码”,dept_code列就可以发挥作用了,这个编码对应中心数据库中的"单位编码",初始数据只能通过手工匹配核对填写,通过该字段实现本地部门表jsgl_dept与中心数据库中的部门表的对应关系。
然后写一个过程,对数据信息同步,定时调用该过程(在应用程序中实现),就可以实现数据同步了。
create or replace procedure sp_process_rs_jbxx is
v_count number(3);
v_insert_dw number(3);
v_update_user number(3);
begin
--记录插入的单位数
v_insert_dw := 0;
v_update_user := 0;
DBMS_OUTPUT.PUT_LINE('BEGIN人事信息同步');
--循环单位信息,同步到本地jsgl_dept表
for r in (select "单位代码","单位",count(*) from rs_jbxx where "单位代码" is not null group by "单位代码","单位") loop
select count(*) into v_count from jsgl_dept where dept_code=r.单位代码;
if v_count=0 then
v_insert_dw :=v_insert_dw+1;
insert into jsgl_dept(dept_code,dept_name) values(r.单位代码,r.单位);
end if;
end loop;
--循环用户信息,更新本地用户的单位号
for r in (select "工号","姓名","单位代码" from rs_jbxx) loop
select count(*) into v_count from jsgl_user where user_name=r.工号;
if v_count=1 then
v_update_user:=v_update_user+1;
update jsgl_user set jsgl_user.dept_id=(select dept_id from jsgl_dept where dept_code=r.单位代码) where user_name=r.工号;
end if;
end loop;
DBMS_OUTPUT.PUT_LINE('END人事信息同步');
DBMS_OUTPUT.PUT_LINE('插入部门数:'||v_insert_dw);
DBMS_OUTPUT.PUT_LINE('更新用户表记录数:'||v_update_user);
end sp_process_rs_jbxx;
3、总结
使用内部无意义主键(跟业务不相关的主键),对于保持系统内部数据一致性,灵活性的重要性。联想到我们学校使用的财务系统的例子,在数据治理之前,用户名使用工资号进行个人财务信息查询。数字化校园实施后,根据信息化建设统一规划,需要使用工号作为登录名,可能就涉及到系统的修改。
数据库设计的一点小经验,仅供参考。