《MySQL高级篇》九、数据库的设计规范,大数据开发自定义View详解

本文详细介绍了数据库设计中的范式理论,包括第一范式、第二范式、第三范式、BCNF和第四范式,并通过实例说明了每个范式的重要性。文章还讨论了反范式化在大数据开发中的应用,解释了在特定场景下如何通过引入冗余数据来优化查询性能。作者强调了在实际设计中需要兼顾理论与性能,灵活运用范式和反范式,以实现最佳的数据库设计方案。
摘要由CSDN通过智能技术生成

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

但是这个数据表不满足第二范式,因为数据表中的字段之间还存在着如下的对应关系:

# 姓名和年龄部分依赖球员编号。
(球员编号) → (姓名,年龄)

# 比赛时间, 比赛场地部分依赖(球员编号, 比赛编号)。
(比赛编号) → (比赛时间, 比赛场地)

对于非主属性来说,并非完全依赖候选键。这样会产生怎样的问题呢?(为什么要满足2NF)

  1. 数据冗余: 如果一个球员可以参加 m 场比赛,那么球员的姓名和年龄就重复了 m-1 次。一个比赛也可能会有 n 个球员参加,比赛的时间和地点就重复了 n-1 次。
  2. 插入异常: 如果我们想要添加一场新的比赛,但是这时还没有确定参加的球员都有谁,那么就没
    法插入。
  3. 删除异常: 如果我要删除某个球员编号,如果没有单独保存比赛表的话,就会同时把比赛信息删
    除掉。
  4. 更新异常: 如果我们调整了某个比赛的时间,那么数据表中所有这个比赛的时间都需要进行调
    整,否则就会出现一场比赛时间不同的情况。

为了避免出现上述的情况,我们可以把球员比赛表设计为下面的三张表。

表名 属性(字段)
球员 player 表 球员编号、姓名和年龄等属性
比赛 game 表 比赛编号、比赛时间和比赛场地等属性
球员比赛关系 player_game 表 球员编号、比赛编号和得分等属性

这样的话,每张数据表都符合第二范式,也就避免了异常情况的发生。

1NF告诉我们字段属性需要是原子性的,而2NF告诉我们一张表就是一个独立的对象,一张表只表达一个意思

举例三

image-20221127193808695

小结: 第二范式(2NF)要求实体的属性完全依赖主关键字。如果存在不完全依赖,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与元实体之间是一对多的关系。

2.6 第三范式(3rd NF)

第三范式是在第二范式的基础上,确保数据表中的每一个非主键字段都和主键字段直接相关,也就是说,要求数据表中的所有非主键字段不能依赖于其他非主键字段。(即,不能存在非主属性A依赖于非主属性B,非主属性B依赖于主键C的情况,即存在"A–>B–>C"的决定关系)通俗地讲,该规则的意思是所有非主键属性之间不能有传递依赖关系,必须相互独立。(这里的主键可以拓展为候选键)

举例一

部门信息表 :每个部门有部门编号(dept_id)、部门名称、部门简介等信息。

员工信息表 :每个员工有员工编号、姓名、部门编号。列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。(因为会存在传递依赖,也就会导致4种不合理地方)

如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。

举例二

image-20221127200525576

image-20221127200454347

举例三

image-20221127200701162

表名 属性(字段)
球队表 球员编号、姓名和球队名称
球员表 球队名称、球队主教练

举例四

image-20221127201249899

符合3NF后的数据模型通俗地讲,2NF和3NF通常以这句话概括:“每个非键属性依赖于键,依赖于整个键,并且除了键别无他物”。

2.7 小结

关于数据表的设计,有三个范式要遵循。

(1)第一范式(1NF),确保每列保持原子性

数据库的每一列都是不可分割的原子数据项,不可再分的最小数据单元,而不能是集合、数组、记录等非原子数据项。

(2)第二范式(2NF),确保每列都和主键完全依赖

尤其在复合主键的情况向下,非主键部分不应该依赖于部分主键。

(3)第三范式(3NF),确保每列都和主键直接相关,而不是间接相关

**范式的优点:**数据的标准化有助于消除数据库中的数据冗余,第三范式(3NF)通常被认为在性能、拓展性和数据完整性方面达到了最好的平衡。

**范式的缺点:**范式的使用,可能降低查询的效率。因为范式等级越高,设计出来的数据表就越多、越精细,数据的冗余度就越低,进行数据查询的时候就可能需要关联多张表,这不但代价昂贵,也可能使一些索引策略无效

范式只是提出了设计的标准,实际上设计数据表时,未必一定要符合这些标准。开发中,我们会出现为了性能和读取效率违反范式化的原则,通过增加少量的冗余或重复的数据来提高数据库的读性能,减少关联查询,join表的次数,实现空间换取时间的目的。因此在实际的设计过程中要理论结合实际,灵活运用。

范式本身没有优劣之分,只有适用场景不同。没有完美的设计,只有合适的设计,我们在数据表的设计中,还需要根据需求将范式和反范式混合使用。

3. 反范式化

3.1 概述

有的时候不能简单按照规范要求设计数据表,因为有的数据看似穴余,其实对业务来说十分重要。这个时候,我们就要遵循业务优先的原则,首先满足业务需求,再尽量减少冗余。

如果数据库中的数据量比较大,系统的UV和PV访问频次比较高,则完全按照MySQL的三大范式设计数据表࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值