一个困扰很久的问题,请教!

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




...全文
127 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ask_chang 2011-04-07
  • 打赏
  • 举报
回复
在工资表中加一列员工名称
renzhe02 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hohololo 的回复:]
引用 3 楼 so_cool 的回复:
另外在建一个记录员工转部门的表,
如:
工号 部门编号 转部门日期
这样就可以关联查询出来.

这个的确是一个办法,问题是怎么关联这个表:
如:
工号 部门编号 进部门日期 出部门日期
1 2 2011-03-01 2011-04-01
1 3 2011-04-01

怎样根据工资表的部门编号,来关联上面的第一条还是第二条记录?
[/Quote]

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


hohololo 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 so_cool 的回复:]
另外在建一个记录员工转部门的表,
如:
工号 部门编号 转部门日期
这样就可以关联查询出来.
[/Quote]
这个的确是一个办法,问题是怎么关联这个表:
如:
工号 部门编号 转部门日期
1 2 2011-03-01
1 3 2011-04-01

怎样根据工资表的部门编号,来关联上面的第一条还是第二条记录?
bluesmiler 2011-04-06
  • 打赏
  • 举报
回复
看错。。。
hohololo 2011-04-06
  • 打赏
  • 举报
回复
你好,我说的是修改员工的部门,不是修改Deparment表。

[Quote=引用 4 楼 bluesmiler 的回复:]
SQL code
最好有id,no
一般id作为内部码关联,是不会变的,变的是no,比如你
DepartmentId Departmentno DepartmentName
1 01 开发部
即使你Departmentno 变为02,如下
DepartmentId Departmentno DepartmentName
1 02 开发部
但明细数据存储都是以id作为关联健,数据显示……
[/Quote]
bluesmiler 2011-04-06
  • 打赏
  • 举报
回复
设计表结构的时候最好先考虑到,比如像超市类的商品表什么的需要频繁变更的,明细数据都是用id做关联的
bluesmiler 2011-04-06
  • 打赏
  • 举报
回复
最好有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

So_CooL 2011-04-06
  • 打赏
  • 举报
回复
另外在建一个记录员工转部门的表,
如:
工号 部门编号 转部门日期
这样就可以关联查询出来.
hohololo 2011-04-06
  • 打赏
  • 举报
回复
加上主键也解决不了问题啊,我的意思是说,如果在当月修改了员工表的departmentid,前面的工资通过表关联的话,都变成修改后的部门编号了。
yuerjiajia 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 hohololo 的回复:]
三、没办法,我只能在salary表中增加字段departmentid,但是这样是不是又不满足数据库的范式要求?
[/Quote]

这是最方便的办法 范式不是数据库设计的绝对要求

如果要满足第三范式 那就增加一个员工部门变更的表 但是这样会增加查询的复杂度 实际应用没啥好处
hohololo 2011-04-06
  • 打赏
  • 举报
回复
怎么没人回答啊!
qgqch2008 2011-04-06
  • 打赏
  • 举报
回复
Salary表(工资表)id identity(1,1)(主键) YueFen FaultId Basic Addition Total

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧