有一个问题困扰了很久,现在描述一下。
例如,如果要做一个简单的工资系统,我设计的表主要有三个:
Deparment表(部门表)
DepartmentId DepartmentName
1 开发部
2 市场部
3 售后服务
4 财务
Fault表(员工表)
FaultId FaultName DepartmentId
1 张三 2
2 李四 1
3 王五 3
4 陈六 4
5 赵七 1
6 许三多 2
Salary表(工资表)
YueFen FaultId Basic Addition Total
2011-03 1 2000.00 800.00 2800.00
2011-03 2 2000.00 800.00 2800.00
2011-03 3 2000.00 800.00 2800.00我的问题是:
一、上面的设计根据范式的要求有问题吗?
二、如果没有问题,那各部门的领导如果要统计某一段时间内该部门发的工资数,就会出现问题。比方说李四,在2010-04月份是将原来的部门编号1改为4,那么统计李四的2010-01至今的工资总数,不就都是4的了,而在前三个月李四都是部门1的人啊。
三、没办法,我只能在salary表中增加字段departmentid,但是这样是不是又不满足数据库的范式要求?
四、这种问题你们都是怎么解决的,请赐教。
例如,如果要做一个简单的工资系统,我设计的表主要有三个:
Deparment表(部门表)
DepartmentId DepartmentName
1 开发部
2 市场部
3 售后服务
4 财务
Fault表(员工表)
FaultId FaultName DepartmentId
1 张三 2
2 李四 1
3 王五 3
4 陈六 4
5 赵七 1
6 许三多 2
Salary表(工资表)
YueFen FaultId Basic Addition Total
2011-03 1 2000.00 800.00 2800.00
2011-03 2 2000.00 800.00 2800.00
2011-03 3 2000.00 800.00 2800.00我的问题是:
一、上面的设计根据范式的要求有问题吗?
二、如果没有问题,那各部门的领导如果要统计某一段时间内该部门发的工资数,就会出现问题。比方说李四,在2010-04月份是将原来的部门编号1改为4,那么统计李四的2010-01至今的工资总数,不就都是4的了,而在前三个月李四都是部门1的人啊。
三、没办法,我只能在salary表中增加字段departmentid,但是这样是不是又不满足数据库的范式要求?
四、这种问题你们都是怎么解决的,请赐教。
一般id作为内部码关联,是不会变的,变的是no,比如你
DepartmentId Departmentno DepartmentName
1 01 开发部
即使你Departmentno 变为02,如下
DepartmentId Departmentno DepartmentName
1 02 开发部
但明细数据存储都是以id作为关联健,数据显示用no,所以查询毫无影响
select a.no,sum(b.total) from a,b where a.id=b.id
在上表的基础上增加一列
deptChange表
faultid departmentID 进部门日期 出部门日期
1 2 2011-03-01 2011-04-01
1 3 2011-04-01
/*查询开发部当月的工资数据
这里只能查询一个时间单位(月)的数据,如果跨几个月的工资数据,
还需要其他语句才可以.
*/
select *
deparment D inner join
(--时间点的部门人员清单
select faultid,departmentID from deptChange
where getdate()>进部门日期 and (getdate()<出部门日期 or 出部门日期 is null)
) V on D.departmentID=V.departmentID
inner join Fault F ON ON F.FAULTId= v.faultid
inner join salary s on F.FAULTId= s.faultid
where d.DepartmentName='开发部'