我们在设计数据库的时候,可能会犯以下错误:
比如,有这么一个表:
1.数据冗余:
如果要修改课程的学分,则需要对所有相应的课程对应的学分都进行修改,多麻烦
2.更新异常
如果把张三的语文学分修改为5分,那么李四和王五就不服气了,凭什么一样的课程他张三就能得5个学分...
3.插入异常
假设要开一门新的课程,暂时没有人选修,则无法记录到表中,因为没有学号,(学号,课程名称可作为主键).
4.删除异常
假设一批学生选修的课程完成了,这些选修课的记录都应该从数据库中删除,但与此同时,课程名称和学分信息也被删除了.
数据库设计范式:
数据库设计常用范式 (1NF,2NF, 3NF)
(1) 第一范式
数据库表中的字段都是单一属性的,不可再分。(但也不是绝对的,反例如微软的Profile数据表的情况)。
(2) 第二范式
数据库表中的一些非主键字段部分依赖于部分主键字段。(如上例中,主键应该为学号与课程名称,姓名依赖于学号,学分依赖于课程名称),此种情况只是针对主键是多个字段的情况。(反例:以上例子中,如果每学期的课程名称的学分不确定,可能会有变化,则这里另当别论)。
(3) 第三范式
数据库表中的一些非主键字段部分依赖于其它非主键字段。
依据范式,我们可以修改上面的表为三个表:
1.------------------------------------------->满足2NF
2.------------------------------------------->满足2NF
3.学生和课程之间的关系是多对多,我们实际设计数据库的时候,通常在两个表之间再建一个表,以两个表的主键来做第三个表的联合主键,显然这里不太适用.
没关系,我们还有另一种方法---------------------------------------满足3NF
这里,学号和课程就不是联合主键的身份了
总结:
关于数据库设计的基本原则是:
1.正确反映数据与数据(信息与信息)之间的层次逻辑关系.
2.对进入到数据库中的数据有一个有效性检查.
3.对数据库中的数据进行非逻辑操作进行相应的错误处理.
4.满足系统对性能上的要求.
我们在设计数据库之前一般要根据需求来进行数据库分析,然后再去设计一个完善的数据库,分析的时候画出实体关系模型(ER-建模),我一般用PD这个工具来进行ER建模.
比如,有这么一个表:
学号 | 姓名 | 课程名称 | 成绩 | 学分 |
1 | 张三 | 语文 | 80 | 3 |
2 | 李四 | 语文 | 90 | 3 |
3 | 王五 | 语文 | 56 | 3 |
1 | 张三 | 数学 | 75 | 2 |
1 | 张三 | 物理 | 82 | 5 |
1.数据冗余:
如果要修改课程的学分,则需要对所有相应的课程对应的学分都进行修改,多麻烦
2.更新异常
如果把张三的语文学分修改为5分,那么李四和王五就不服气了,凭什么一样的课程他张三就能得5个学分...
3.插入异常
假设要开一门新的课程,暂时没有人选修,则无法记录到表中,因为没有学号,(学号,课程名称可作为主键).
4.删除异常
假设一批学生选修的课程完成了,这些选修课的记录都应该从数据库中删除,但与此同时,课程名称和学分信息也被删除了.
数据库设计范式:
数据库设计常用范式 (1NF,2NF, 3NF)
(1) 第一范式
数据库表中的字段都是单一属性的,不可再分。(但也不是绝对的,反例如微软的Profile数据表的情况)。
(2) 第二范式
数据库表中的一些非主键字段部分依赖于部分主键字段。(如上例中,主键应该为学号与课程名称,姓名依赖于学号,学分依赖于课程名称),此种情况只是针对主键是多个字段的情况。(反例:以上例子中,如果每学期的课程名称的学分不确定,可能会有变化,则这里另当别论)。
(3) 第三范式
数据库表中的一些非主键字段部分依赖于其它非主键字段。
依据范式,我们可以修改上面的表为三个表:
1.------------------------------------------->满足2NF
学号 | 姓名 |
1 | 张三 |
2 | 李四 |
3 | 王五 |
课程 | 学分 |
语文 | 3 |
数学 | 2 |
物理 | 5 |
学号 | 课程 | 成绩 |
1 | 语文 | 80 |
2 | 数学 | null |
3 | 物理 | null |
自动增长标识列 | 学号 | 课程 | 成绩 |
1 | 1 | 语文 | 80 |
2 | 1 | 数学 | 75 |
3 | 1 | 物理 | 82 |
4 | 2 | 语文 | 90 |
5 | 3 | 语文 | 56 |
总结:
关于数据库设计的基本原则是:
1.正确反映数据与数据(信息与信息)之间的层次逻辑关系.
2.对进入到数据库中的数据有一个有效性检查.
3.对数据库中的数据进行非逻辑操作进行相应的错误处理.
4.满足系统对性能上的要求.
我们在设计数据库之前一般要根据需求来进行数据库分析,然后再去设计一个完善的数据库,分析的时候画出实体关系模型(ER-建模),我一般用PD这个工具来进行ER建模.