【第38天】SQL进阶-SQL设计优化-范式设计(SQL 小虚竹)

回城传送--》《100天精通MYSQL从入门到就业》

文章目录

零、前言

今天是学习 SQL 打卡的第 38 天。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

今天的学习内容是:SQL设计优化-范式设计

一、练习题目

题目链接 难度
客户和订单 ★★★☆☆

二、SQL思路


初始化数据

什么是范式设计

范式设计是数据库设计的一种方法,通过分解数据表来消除数据冗余和更新异常。通过逐步应用范式规则,可以将一个原始的、可能冗余的数据库结构转化为一个更加规范、高效的结构。

范式设计有助于减少数据冗余、提高数据一致性,并降低数据维护的复杂性。

第一范式(1NF)

第一范式要求数据库表的每一列都是不可分割的原子项。换句话说,每个字段都是最小的数据单元,不能再进行拆分。

例子:

假设有一个包含"姓名"和"地址"字段的表,其中"地址"字段包含了省、市、区等多个信息。

这违反了第一范式,因为"地址"字段可以进一步拆分为"省份"、"城市"和"区域"等字段。

第二范式(2NF)

在满足第一范式的基础上,第二范式要求数据库表中的非主键字段 必须完全依赖 于整个主键,而不是仅仅依赖于主键的一部分。

例子:

假设有一个包含"订单号"、"商品号"和"商品数量"的表,其中"订单号"和"商品号"共同作为主键。

如果"商品数量"只依赖于"商品号",那么这就违反了第二范式。为了满足第二范式,需要将这个表拆分为两个表,一个包含订单信息,另一个包含商品和数量的关系。

第三范式(3NF)

在满足第二范式的基础上,第三范式要求消除传递依赖。即非主键字段之间不能存在传递依赖关系,每个字段应该直接依赖于主键。

例子:

假设有一个包含"学生信息"的表,其中包含"学号"、"姓名"和"班级号"字段,以及一个"班级信息"表,包含"班级号"和"班主任姓名"字段。

在这个例子中,"班主任姓名"字段通过"班级号"字段与学生信息存在传递依赖关系,这违反了第三范式。

为了满足第三范式,应该将"班主任姓名"字段从"学生信息"表中移除,并只在"班级信息"表中保留。

三、总结

范式设计是数据库设计中至关重要的一环,它帮助我们创建高效、规范的数据结构。通过逐步应用第一范式、第二范式和第三范式的规则,我们可以消除数据冗余、提高数据一致性,并降低数据维护的复杂性。在实际应用中,我们需要根据具体需求和场景选择合适的范式级别,以达到最佳的数据库设计效果。

所以,嗯,这题的答案选。。评论区大声告诉虚竹哥。

四、参考

我是虚竹哥,我们明天见~

相关推荐
Mahir081 天前
Redis 三大缓存问题:穿透、击穿、雪崩的原理与完整解决方案
数据库·redis·缓存·面试·大厂面试题
dFObBIMmai1 天前
Redis怎样定位每秒被高频访问的热点键
jvm·数据库·python
m0_609160491 天前
golang如何实现负载均衡器组件_golang负载均衡器组件实现详解
jvm·数据库·python
m0_591364731 天前
SQL如何解决GROUP BY导致查询变慢_利用覆盖索引进行优化
jvm·数据库·python
2401_850491651 天前
c++如何批量修改文件后缀名_std--filesystem--replace_extension【实战】
jvm·数据库·python
m0_463672201 天前
golang如何使用sync.WaitGroup_golang sync.WaitGroup并发等待使用方法
jvm·数据库·python
X56611 天前
CSS如何实现元素边框颜色渐变_利用border-image方案
jvm·数据库·python
GISer_Jing1 天前
GIS论述-6大核心技术方向全解
数据库·arcgis·ai
duke8692672141 天前
c++ trpc-cpp框架 c++如何使用腾讯trpc构建微服务
jvm·数据库·python
我叫Double1 天前
简易版的EINO基于redis库的向量搜索项目
数据库·redis·缓存