阅读以下关于数据库设计的叙述,在答题纸上回答问题1至问题3。
【说明】
某公司为了鼓励员工考取技能证书,提升公司竞争力,准备设计一套技能需求水平管理系统。王工在设计之处进行了系统分析,建立了以下数据库模型:
技能表(技能ID、技能描述),主键是技能 ID;
员工表(员工ID、姓名、部门、联系方式),主键是员工 ID;
项目表(项目ID、项目名称、项目描述)、主键是项目ID;
员工技能表(员工ID、技能ID、技能水平);
项目技能需求表(项目ID、技能ID、需求水平)。
备注:技能水平分为初级、中级、高级,一个员工有多个技能。一个项目需要多个技能,一个项目也可以同一个技能需要多个水平。
员工技能表的主键、函数依赖是?满足第几范式?项目技能需求表主键、函数依赖是?满足第几范式?
员工技能表主键:(员工 ID,技能 ID)。函数依赖:员工 ID,技能 ID)→技能水平。该表满足第三范式(3NF)。
项目技能需求表:主键是(项目 ID,技能 ID,需求水平)。函数依赖:((项目 ID,技能 ID,需求水平)→ (项目 ID,技能 ID,需求水平)。该表满足第三范式(3NF)。
对员工技能表,由于一个员工可对应多个技能、一个技能也可由多名员工掌握,用单列(员工ID或技能ID)均无法唯一标识记录,故候选码为(员工ID, 技能ID),取其为主码;在该表中唯一的非主属性是“技能水平”,它对整个主码完全函数依赖:给定某员工与某技能的组合即可唯一确定其水平,不存在对主码某一真子集的依赖,因而无部分函数依赖;同时表内也不存在“非主属性→非主属性”的传递依赖。据此该表满足3NF。更进一步地,表内唯一的非平凡决定因素就是主码本身,任何决定因素都是超码,因而亦满足BCNF。这一判断与业务语义一致:员工的技能水平不依赖于姓名、部门等外部属性,仅由(员工ID, 技能ID)决定。
对项目技能需求表,为满足“同一项目对同一技能可要求多个水平”的前提,必须将需求水平纳入主码,否则将无法同时保存“中级”“高级”两条需求,或被迫以重复列等非规范化方式建模。采用主键(项目ID, 技能ID, 需求水平)后,表中不存在非主属性(或仅有主属性),其非平凡函数依赖只有主码对自身(恒等依赖),因此自然满足3NF。同时,任一决定因素都是超码,亦满足BCNF。若业务改为“至少达到某一最低水平”,则可将需求水平改为“最低水平”并取(项目ID, 技能ID)为主键,但那是另一种业务假设,本题不采纳以避免与原题设矛盾。