数据库知识

我们在设计数据库的时候,可能会犯以下错误:
  
比如,有这么一个表:
学号姓名课程名称成绩学分
1张三语文803
2李四语文903
3王五语文563
1张三数学752
1张三物理825

1.数据冗余:
如果要修改课程的学分,则需要对所有相应的课程对应的学分都进行修改,多麻烦
2.更新异常
如果把张三的语文学分修改为5分,那么李四和王五就不服气了,凭什么一样的课程他张三就能得5个学分...
3.插入异常
假设要开一门新的课程,暂时没有人选修,则无法记录到表中,因为没有学号,(学号,课程名称可作为主键).
4.删除异常
假设一批学生选修的课程完成了,这些选修课的记录都应该从数据库中删除,但与此同时,课程名称和学分信息也被删除了.

数据库设计范式:

数据库设计常用范式
(1NF2NF 3NF)
(1)
第一范式
数据库表中的字段都是单一属性的,不可再分。
(但也不是绝对的,反例如微软的Profile数据表的情况)

(2)
第二范式
数据库表中的一些非主键字段部分依赖于部分主键字段。(如上例中,主键应该为学号与课程名称,姓名依赖于学号,学分依赖于课程名称),此种情况只是针对主键是多个字段的情况。(反例:以上例子中,如果每学期的课程名称的学分不确定,可能会有变化,则这里另当别论)

 (3)
第三范式
数据库表中的一些非主键字段部分依赖于其它非主键字段。

 依据范式,我们可以修改上面的表为三个表:
1.------------------------------------------->满足2NF
学号姓名
1张三
2李四
3王五
2.------------------------------------------->满足2NF
课程学分
语文3
数学2
物理5
3.学生和课程之间的关系是多对多,我们实际设计数据库的时候,通常在两个表之间再建一个表,以两个表的主键来做第三个表的联合主键,显然这里不太适用.
学号课程成绩
1语文80
2数学null
3物理null
没关系,我们还有另一种方法---------------------------------------满足3NF
自动增长标识列学号课程成绩
11语文80
21数学75
31物理82
42语文90
53语文56
这里,学号和课程就不是联合主键的身份了

总结:
关于数据库设计的基本原则是:
1.正确反映数据与数据(信息与信息)之间的层次逻辑关系.
2.对进入到数据库中的数据有一个有效性检查.
3.对数据库中的数据进行非逻辑操作进行相应的错误处理.
4.满足系统对性能上的要求.
我们在设计数据库之前一般要根据需求来进行数据库分析,然后再去设计一个完善的数据库,分析的时候画出实体关系模型(ER-建模),我一般用PD这个工具来进行ER建模.
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值