有一个问题困扰了很久,现在描述一下。
例如,如果要做一个简单的工资系统,我设计的表主要有三个:
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,但是这样是不是又不满足数据库的范式要求?
四、这种问题你们都是怎么解决的,请赐教。

解决方案 »

  1.   

    Salary表(工资表)id identity(1,1)(主键)  YueFen FaultId Basic Addition Total
      

  2.   

    加上主键也解决不了问题啊,我的意思是说,如果在当月修改了员工表的departmentid,前面的工资通过表关联的话,都变成修改后的部门编号了。
      

  3.   

    最好有id,no
    一般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
      

  4.   

    你好,我说的是修改员工的部门,不是修改Deparment表。
      

  5.   


    在上表的基础上增加一列
    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='开发部'