关于验证数据表设计是否符合第三范式(3NF)及字段星号含义的技术咨询
数据库设计3NF合规性分析与星号含义说明
字段后的星号是什么?
字段名后面的星号代表外键(Foreign Key),是用来关联其他表主键的标识:
StaffDetails.DivisionNo*关联Division.DivisionNo,用来标记员工所属的部门StaffProject.StaffId*关联StaffDetails.StaffID,StaffProject.ProjectNo*关联Project.ProjectNo,用来记录员工和项目的对应关系
现有设计是否符合第三范式(3NF)?
结论:不符合3NF,主要问题出在StaffProject表,下面逐个表分析:
符合范式的表
StaffDetails:主键是StaffID,所有非主键字段(SName、DOB、DivisionNo)都直接依赖主键,没有传递依赖或部分依赖,完全符合3NFDivision:主键DivisionNo,DivName直接依赖主键,DivSupervisorID作为部门主管的员工ID,是直接关联部门的属性(每个部门对应一个主管),没有违反范式的问题,符合3NFProject:主键ProjectNo,ProjectName直接依赖主键,结构简洁合规,符合3NF
违反范式的核心问题:StaffProject
这个表的复合主键是StaffId + ProjectNo,但里面冗余了SName和ProjectName两个字段:
SName只依赖StaffId(复合主键的其中一部分),属于部分依赖,违反了第二范式(2NF)——而3NF的前提是必须满足2NF,所以这个表直接不符合3NFProjectName只依赖ProjectNo(复合主键的另一部分),同样是部分依赖,而且这两个字段已经分别在StaffDetails和Project表中存储了,重复存储会导致数据不一致(比如员工改名后,要同时更新两张表的SName,很容易出错)
简单修正方案
把StaffProject表中的SName和ProjectName删掉,只保留StaffId、ProjectNo和HoursAssigned三个字段。这样StaffProject就变成一个纯粹的关联表,HoursAssigned依赖整个复合主键,符合2NF和3NF。如果需要查询员工姓名或项目名称,通过外键联表StaffDetails和Project查询就可以了。
内容的提问来源于stack exchange,提问作者Raymond Jian
相关产品推荐
相关产品推荐

