数据库设计三范式

数据库设计三范式

1.0什么设计范式?

设计表的依据,按照这三范式设计设计的表不会出现数据冗余.

复习一下数据依赖 :

  1. 完全依赖: 通过{学生学号, 选修课程名}可以得到{该生本门选修课程的成绩},而通过单独的{学生学号}或者单独的{选修课程名}都无法得到该成绩,则说明{该生本门选修课程的成绩}完全依赖于{学生学号,选修课程名}

  2. 部分函数依赖: 通过{学生学号,课程号}可以得到{该生姓名},而通过单独的{学生学号}已经能够得到{该生姓名},则说明{该生姓名}部分依赖于{学生学号,课程号}; 又比如, 通过{学生学号,课程号}可以得到{课程名称},而通过单独的{课程号}已经能够得到{课程名称},则说明{课程名称}部分依赖于{学生学号,课程号}。(部分依赖会造成数据冗余及各种异常。)

  3. 传递函数依赖: 在关系R(学号,宿舍,费用)中,通过{学号}可以得到{宿舍},通过{宿舍}可以得到{费用},而反之都不成立,则存在传递依赖{学号}->{费用}。(传递依赖也会造成数据冗余及各种异常。)

1.1三范式都是那些?

  1. 第一范式:任何一张表都要有主键,并且每一个字段原子性不可再分

  2. 第二范式:在第一范式基础上,所有非主键字段完全依赖主键,不能产生部分依赖

(注意这里要减少复合主键的使用)

会出现数据冗余,空间浪费;怎么解决?

记住口诀: 多对多,三张表,关系表,两个外键

t_student学生表

sno(PK)sname
1张三
2李四
3王五

t_teacher讲师表

tno(PK)tname
1王老师
2张老师
3李老师

t_student_teacher_relation

id(pk)sno(FK)tno(FK)
113
212
323
421
532
631
  1. 第三范式:建立在第二范式的基础之上,所有的非主键字段直接依赖主键,不能产生传递依赖

满足第三范式(3NF)必须先满足第二范式(2NF)。在满足第二范式的基础上,切不存在传递函数依赖,那么就是第三范式。简而言之,第三范式就是属性不依赖于其它非主属性

记住口诀: 多对多,三张表,关系表,两个外键

记住口诀: 一对多,两张表,多的表,加外键

班级表t_class

cno(PK)cname
1班级1
2班级2

学生表t_student

sno(PK)snameclassno(fk)
101张一1
102张二1
103张三2
104张四2
105张五2

这里所解决的就是消除传递函数依赖

提醒一下:实际开发中,以满足客户的需求为主,有时候会拿冗余换执行速度

1.2一对一怎么设计?

简单用户设计方案:

设计用户登录表t_user_login

id(PK)usernamepassword
1zs123
2ls456

用户详细表设计t_user_detail

id(PK)realnametel
张三11111100
李四11111122

怎么设计?

两种设计方案:

主键共享方案:

id(PK+fk)realnametel
张三11111100
李四11111122

外键唯一:

id(PK)realnameteluserid(FK+Unique)
张三11111100
李四11111122
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

以码平川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值