数据库设计中的三范式(一)
到目前为止,vb.net版个人机房收费系统已经大致地做了一遍了。只是在功能上实现了机房收费系统的功能键,并向自己自己的组长,反映了这一阶段的学习情况。在组长的指导下,自己发现很多的地方处理不好,也存在不少的错误。所以,决定再完善,重构自己的机房收费系统。
下面的内容是数据库设计方面的进一步认识——数据库中的三范式
一、数据冗余(每张一的第一个字段为主键)
在StaffBranch表中有数据冗余,因为分公司的详细信息在每个员工那里被重复了一遍。而在Branch表里,每一个分公司的信息只出现了一次,而在Staff表中只有BranchNO被重复,它用来指出每个员工属于哪个分公司。有数据冗余的表可能有的问题叫做更新异常,它为分为插入、删除和更改异常。
1、插入异常
有两种主要的异常,我们用StaffBranch来说明
(1)比如我们想插入一个新员工的记录,那么也一定要插入新员工的分公司信息,例如插入B003分公司工作的员工,那么必须输入B003公司的详细信息,使得与StaffBranch表中其它的B003公司的员工的详细信息一致,否则会出现数据不致的情况。分开的Staff与Branch表就不存在这种潜在的不致性,因为对于每一个员工,我们只需要加入正确的分公司号到Staff就可以了。另外,B003分公司在Branch表中作为单独的记录在数据库中记录一次。
(2)如果在StaffBranch中插入一个新的,目前还没有员工的公公司信息,需要在与员工有关的列,比如StaffNO中输入空值。但是,StaffNo在表StaffBranch表中是主键,不能为null,否则就违反了实体完整性。
而把StaffBranch表分开的Staff与Branch表就避免这个问题。
2、删除异常
如果我们从StaffBranch中删除一条员工记录,而该员工又是些分公司的最后一名员工,那么,此分公司的信息就不在数据库中了,就丢失了。而分开的Staff与Branch就避免了这个问题。
3、更改异常
如果我们想更改StaffBranch表中的一个列的值,例如分公司B001的电话号码,就必须更改在那个分公司的所有的员工记录,如果此次更改没有在StaffBranch中正确进行,那么数据库就变得不一致了。
二、数据库三范式
1NF(first Normal Form)
每个列和记录包含一个且只包含一个值的表
我们可以看到telNos并不符合1NF的要求,因为每一个记录的telNos不只有一个值。
2NF
第二范式应用于具有复合主键的表,也就是主键是由两个或多个列复合而成的表,具有单列主键的表自动就是2NF。不属于2NF的表,可以就会出现上面所说的数据冗余及更新异常。
3NF
一个已经是第一和第二范式的表并且所有的非主键列的值都只能从主码列得到,而不能从其它列得到