[说明]
某软件开发公司,决定结合自身工作的需求开发设计本公司的项目工作管理系统,由郭工程师承担数据库的设计工作。公司项目管理的需求分析如下。
1.组织机构。该公司有多个部门,每个部门有多个职员、多个办公室,每个办公室有一部电话。当部门变更时更换新的部门代码。职员辞职后,若再次被聘用仍使用辞职前的代码。被聘用职员担任某职务,职务用职务代码来标识。职务分为:工程师、高级工程师、经理助理、经理等。职员的工资根据等级区分,共分为S、A、B、C、D 5个等级。一个职务对应某个等级,一个等级对应多个职务。职员月工资等于职员月工作时间(小时)乘以小时工资。职员的人事变动及职位变更(升级、降级)在月初进行。
2.项目管理。项目用项目代码标识,使用过的项目代码不能重复使用。一个部门可承担多个项目,但一个项目仅由一个部门承担。一个项目有一名项目主管和多个职员;一个职员可参加多个项目。项目代码由系统自动生成,一旦项目建立,项目名、部门代码及起始年月日不能再变更。
3.项目的工作管理流程为:项目工作计划输入(初始计划)→工作业绩输入→业绩生成(每月一次)→计划修正(每月一次)。
①项目工作计划输入。项目主管使用如图1-9所示的计划输入界面,输入项目代码、职员代码、职员参加某个项目的月工作时间(计划)。图中空白区域为可输入项。
项目代码 | 123456 | 项目名 | ABCD | 部门代码 | 03 | 部门名 | 开发部 | |||||||
起始年月日 | 2007-06-11 | 结束年月日 | 2007-11-31 | 登陆时间 | 2007-05-28 | |||||||||
职员代码 | 职员名 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 12月 | 1月 | 2月 | 3月 | 4月 | 5月 | 合计 |
0302 | 小郭 | 120 | 180 | 180 | 180 | 180 | 180 | 1020 | ||||||
0316 | 小谢 | 120 | 180 | 180 | 150 | 150 | 150 | 930 | ||||||
0309 | 张三 | 90 | 150 | 150 | 180 | 180 | 180 | 930 | ||||||
0328 | 李四 | 120 | 180 | 180 | 120 | 120 | 90 | 870 | ||||||
0321 | 王五 | 90 | 150 | 150 | 150 | 150 | 90 | 810 |
职工代号 | 0302 | 职员名 | 小郭 | 输入年月 | 2007 | 6月 | |
年月日 | 星期 | 出勤时间 | 每个项目的工作时间 | ||||
项目代码 | 工作时间 | 项目代码 | 工作时间 | 备注 | |||
2007-06-11 | 一 | 12.0 | 123456 | 8.0 | 345678 | 4.0 | |
2007-06-12 | 二 | 15.0 | 123456 | 10.0 | 345678 | 5.0 | |
2007-06-13 | 三 | 18.0 | 123456 | 15.0 | 345678 | 3.0 | |
2007-06-14 | 四 | 15.0 | 123456 | 15.0 | |||
2007-06-15 | 五 | 18.0 | 123456 | 18.0 | |||
2007-06-16 | 六 | 10.0 | 123456 | 10.0 | |||
2007-06-17 | 日 | 0.0 |
④计划修正。项目主管根据项目进度修改以后的工作计划。
郭工程师根据公司的项目需求将数据库关系模式设计如下:
部门(部门代码,部门名,起始年月,终止年月,办公室,办公电话);
职务(职务代码,职务名);
等级(等级代码,等级名,年月,小时工资);
职员(职员代码,职员名,部门代码,职务代码,任职时间);
项目(项目代码,项目名,部门代码,起始年月日,结束年月日,项目主管);
工作计划(项目代码,职员代码,年月,工作时间)。
[问题1]
请使用“关系模式标记规则”(见本题附内容,全书同),给出“部门”、“等级”、“项目”和“工作计划”关系模式的主键和外键。
参考答案:[问题A]
这是一道要求读者根据题目给定的关系模式,以及属性间的函数依赖关系和给定的关系实例,并结合 E-R图向关系模式的转换方法来确定各关系模式主键和外键的综合分析题。本试题的解答思路如下。
①设K为R(U,F)中的属性的组合,若K→U,且对于K的任何一个真子集K’,都有K’不能决定U,则K为R的候选码(候选关键字),若有多个候选码,则选一个作为主码(主键)。
②部门关系模式的主键和外键。
由题干中给出的关键信息“该公司有多个部门,每个部门有多个职员、多个办公室”可知,部门代码多值决定办公室,如果仅用(部门代码)作为主键,则无法唯一区分部门关系中的每一个元组(记录)。如果用(部门代码,办公室)作为主键,则可以唯一区分部门关系中的每一个元组,因此,部门关系模式的主键如下。
部门(部门代码,部门名,起始年月,终止年月,办公室,办公电话)
③等级关系模式的主键和外键。
由题干中给出的关键信息“一个职务对应某个等级,一个等级对应多个职务”,“职员月工资等于职员月工作时间(小时)乘以小时工资”,“职员的人事变动及职位变更(升级、降级)在月初进行”可知,如果仅用“等级代码”作为主键,则无法唯一区分等级关系中的每一个元组,这是因为对于同一个等级在不同的时期小时工资值不一定一样。例如,等级A在B00G年F月小时工资为A0元,可能到B00G年A0月小时工资为AE元。可见用(等级代码,年月)作为主键,可以唯一区分等级关系中的每一个元组。因此等级关系模式的主键如下。
等级(等级代码,等级名,年月,小时工资)
④项目关系模式的主键和外键。
由题干中给出的关键信息“项目用项目代码标识,使用过的项目代码不能重复使用”可知,项目代码可以决定项目关系中的全属性,因此,项目关系模式的主键是“项目代码”。在项目关系模式中,由于部门代码是部门关系的主键,因此“部门代码”应为项目关系模式的外键。同时考虑到项目主管应该来自职员,所以“项目主管”也是项目关系模式的外键。最后可得项目关系模式的主键、外键如下。
项目(项目代码,项目名,[*],起始年月日,结束年月日,[*])
⑤工作计划关系模式的主键和外键。
由题干中给出的关键信息“一个项目有一名项目主管和多个职员;一个职员可参加多个项目”,“项目代码由系统自动生成,一旦项目建立,项目名、部门代码及起始年月日不能再变更”可知,在工作计划关系中,由于一个项目有多个职员参加,因此仅用“项目代码”作为主键,则无法唯一确定关系中的每一个元组。又由于工作计划是按月给职员安排的,因此工作计划关系的主键是(项目代码,职员代码,年月)。最后可得工作计划关系模式的主键、外键如下。
工作计划(项目带代码,职员带代码,年月,工作时间)