1、数据库命名约定
设计一个项目组内所有数据库的程序员应该遵循统一的“数据库命名规则”。 本书的附录b提供了“数据库命名规则”的示例以供参考。
2、数据库设计范式
设计关系数据库时必须遵守一定的规则。 特别是关于数据库设计范式,接下来简单介绍1NF (第一范式)、2NF )、3NF )第三范式)、BCNF。 另外,还有第四范式和第五范式。 当你设计数据库时,如果能符合这些范式,你就是数据库设计的踏实夕阳。
)1)第一范式(1NF ) ) ) ) ) ) ) ) )。
数据库表中的所有字段都是单个属性,不能再细分。 该单一属性由基本类型构成,有整数型、实数型、字符型、逻辑型、日期型等。
例如,电话字段可能不符合最初的规范化。 因为每个人都需要记录一个以上的电话。 在这种情况下,最简单的方法是不使用电话作为字段名,而是使用家庭电话、移动电话、办公室电话、分机、宿舍电话等。
)2)第二范式(2NF ) ) )。
规则遵循第一个规范化,这是一种主键功能的一部分不决定其他属性的现象。 这意味着除主键以外的其他属性完全依赖于主键。
因为选择关系表为SelectCourse (学号、姓名、年龄、课程名、成绩、单位),关键词为组合关键词)学号、课程名()、姓名、年龄、成绩、单位)等决定关系
此数据库表不满足第二种模式,因为它具有以下决策关系:
(课程名称) (单位),也就是说,如果你知道课程,你就知道该课程的单位。
(学校号码) )姓名、年龄),也就是说只要知道学校号码,就知道那个学生的名字和年龄。
数据冗馀化
如果n名学生选修同一课程,“学分”会重复n吗? 一次; 因为同一个学生修了m科目,所以名字和年龄重复的m? 一场。
更新异常
如果调整了课程的单位,数据表中所有行的“单位”值都会更新。 否则,同一课程的单位可能会不同。
插入异常
如果开设新课程的话,还没有人选择。 这样,由于没有“学校号码”的关键字,所以课程名称和学分也不能记录在数据库中。
删除异常
假设一组学生完成了课程选择,则必须从数据库表中删除这些选择记录。 但是,与此同时,课程名称和学分信息也被删除了。 很明显,这也会导致插入异常。
将选择关系表SelectCourse更改为以下三个表。
学生: Student (学校号码、姓名、年龄) )。
课程:课程名称,单位)。
选择关系: SelectCourse (学号、课程名称、成绩) ) ) ) ) ) ) ) )。
这些数据库表遵循第二范式,消除了数据冗馀、更新异常、插入异常和删除异常。
)3)第三范式(3NF ) ) )。
基于第二模式,如果数据表中没有非关键字段,则任何关键字段候选的传输函数依赖关系符合第三模式。
传递函数依赖是指,如果存在“ABC”的决定关系,则c传递函数依赖于a。 因此,满足第三模式的数据库表应该不存在关键字段-非关键字段x -非关键字段y相关性。
将学生关系表作为Student (学校号码、姓名、年龄、所属学院、学院地点、学院电话),将关键词作为单一关键词“学校号码”,是因为关系决定如下。
(学校号码)(姓名、年龄、所属学院、学院地点、学院电话) )。
该数据库符合2NF标准,但由于存在以下决策关系,因此不符合3NF标准
(学校编号) )所在学院) )、学院地点、学院电话)。
学生关系表分为以下两个表。
学生:(学号、姓名、年龄、所属学院);
学院:(学院、地点、电话。
)4) BCNF范式
BCNF范式(Boyce/Codd Normal Form )是R.F.Boycy和E.F. Codd共同提出的,可以计算为第三正则化的补充。 规则符合第三正则化原则,且没有非主键属性在功能上可以决定主键的一部分的现象。
假设有一个具有属性a、b、c、d、e的表r。 假设a和b是复合主键,R={A,b,c,d,E}。 如果存在非主键属性,例如c可以在功能上决定b、CB,b是主键的一部分。 在这种情况下,第三正则化无法分辨这样的错误。 制作新的相关表R1并放入CB,R1={C,B},但原表r还是以(a,b )为复合主键,以b为外键与新的表相关联,保存原信息。
R={A,b,d,E},R1={C,B},R.B=R1.B