MySQL 系列第三天

MySQL 系列第三天

本篇文章讲了实体之间的三种关系,范式基础以及高级 SQL 操作。

实体之间的关系

MySQL 数据库是一个管理存储在磁盘上的数据的媒介,这里的数据必然是由自然世界中产生。而我们自然世界中的数据关系错综复杂,有时很难理清他们的关系。

但是,无论他们有多复杂,实体之间的关系都可以用三种关系来概括,分别是一对一、一对多以及多对多。

实体之间的具体关系是通过一条条记录来表现的,这就好比实体(也就是表)是一个类,而具体的记录就是它的对象。OOP 中讨论的不一直都是对象之间的关系吗?

一对一的关系

一张表中的某条记录只能对应另一种表中的一条记录,反之亦然。比如,存储一个人的信息表中,我们为了效率更高,把常用信息和不常用信息分为两张表存储。然后,给第二张表添加一个第一张表的唯一字段,这样两张表的记录可以互相找到对方。

p_idusernamepwd
1rightalignedxxxx
2centeredxxxxx
3areneatxxxx

idadresstelp_id
1杭州134124336751
2深圳135124336752
3瑞昌136124336753

一对多的关系

表 A 中的一条记录对应表 B 中的多条记录,反过来,就是表 B 中的每一条记录都只能对应着表 A 中的一条记录。比如,省份表和市表,同样是表 B 中添加一条表 A 的唯一字段作为标识。

ProIdnameproNumber
1江西16
2广东12
3浙江5

CitIdnameproNumber
1南昌16
2广州12
3杭州5
4九江16

多对多的关系

更复杂的就是多对多的关系了,比如老师和学生关系。一个学生可以有多个老师,一个老师可以教多个学生。

一个字段显然不能表示出这种多对多的关系,那如何表示呢?一般多对多的关系都是添加一个新表,实际开发当中或更为复杂,但这也是一种解决方案。所以,这里可以在学生表和老师表之外添加一个学生老师关系表来维护他们的关系。

teaIdnameteaNumber
1王浩17
2王爽12
3陈康5
4李贺16

stuIdnamestuNumber
1张三01
2李四10
3王五58
4李六15

IdstunumberteaNumber
10116
21012
3105
41516

什么是范式?

在设计数据库时,做到减少数据冗余是非常重要的,也就是避免相同的数据重复多次。这时候就出现了一种减少数据冗余的规范,名字就叫做「范式」(英文名 Normal Format)。

范式是一种分层的数据规范,一共分为六层。满足下一层范式的前提是上一层范式必须成立。六层范式可以记作:1NF,2NF … 6NF 。它是一种指导规范,而不是必须强制执行的规定。

范式减少冗余度的同时也降低了数据存取的效率,所以很多时候我们并不会严格遵照范式去设计数据库,毕竟时间更宝贵,牺牲点空间算什么呢,能用钱解决的问题都不是问题呢。

第一范式

第一层范式规定,表中的字段必须具有原子性,不可再分。比如,下面第一张表就不符合 1NF 的要求,应该改为第二张表的形式。

Idtime
12014-1-4 - 2014-5-4
22014-5-4 - 2014-7-4
32014-8-4 - 2014-11-4
42014-1-4 - 2014-3-4

Idstartend
12014-1-42014-5-4
22014-5-42014-7-4
32014-8-42014-11-4
42014-1-42014-3-4

第二范式

第二层范式规定,不允许出现某字段依赖部分主键的问题,这通常是因为表中存在复合主键。比如,表一中的 tel 和 username 共同作为主键时,gender 只依赖于 username ,这就是部分依赖。解决方法可以是放弃复合主键,添加一个逻辑主键,不过这个是治标不治本。

telusernamegender
13476452345rightaligned
18223244234centered
17383652833areneat

第三范式

第三层范式规定,不得出现传递依赖。比如,下表中的 gender 依赖于 username ,username 又依赖于主键,room 依赖于 calss ,class 又依赖于主键。这就是典型的部分依赖的问题。

idusernamegenderclassroom
1rightaligned1501218
2centered1504213
3areneat1505402

可以修改为以下三张表的形式

idusernamegender
1rightaligned
2centered

idclassroom
11501218
21504213
31505402

idusernameIdclassId
111
222
333

这里解决第三范式的问题,自然符合了范式的规定,但这会带来效率低下的问题。很多时候我们更希望效率高一点,这时就会不会完全遵照范式的要求来设计数据库。上述最好的方式还是第一种设计,尽管它存在传递依赖的问题,但他换来了效率的提升,是很值得的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值