数据实体建模和数据库设计
1. 实体关系模型(E-R模型):实体,属性,关系
实体:student(类) 表:student
Id id
Name name
Course c c_id(引用课程表id)
映射关系:一对一,一对多,多对多。
2. 建表三大范式:
第一范式(1NF):数据库每一列都是不可再分的基本数据项,同一列中不能有多个值。即:所有的属性都必须是单值,也就是属性只表示单一的意义(记录可以重复,没有任何限制)。也即:不能以集合、序列作为属性值。
如(违背1NF): name phoneNumber
张三 15855……, 0551-8506198
第二范式(2NF):数据库不存在非关键字段对任何候选关键字的依赖。即:属性要求唯一且非空(记录不可重复,但是数据可能会出现冗余)。也即:有一个字段唯一且非空的,比如id。但是数据很可能冗余,会造成数据不一致。
如(违背2NF): 选课(学号,课程号,成绩,学分)
主键:学号,课程号
问题:数据冗余:如果一个班级40人,学分存40次。
更新异常:如果学分更改,需要更新所有学生记录。
插入异常:如果新开课没有学生选修,记录无法插入。
删除异常:学生毕业,删除学生记录,相应的课程也被删除。
原因:学分对主键关键字(学号,课程号)存在部分的依赖。
解决办法(拆分):学生(学号,课程号,成绩)
课程 (课程号,学分)
第三范式(3NF):数据库不存在非关键字段对任何候选关键字存在传递引用。即:非主属性只能依赖于主属性,不能依赖于其他非主属性(解决数据冗余问题)。也即:非主属性间无依赖关系了。在2NF的基础上拆表。比如student表和course表。
如(违背2NF):学生(学号,姓名,系号,系名,系地址)
主键:学号
也存在上述2NF中的异常
原因(存在传递):学号 ——> 系号 ——>系地址
解决办法(拆分): 学生(学号,姓名,系号)