MySQL 必知必会
朱晓峰
前摩根大通银行技术部副总裁、系统架构师
17746 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
MySQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

22 | 范式:如何消除冗余,实现高效存取?

你好,我是朱晓峰。今天,我们来聊一聊数据表设计的范式。
在超市项目的设计阶段,超市经营者把他们正在用的 Excel 表格给到我们,要求我们把这些数据存储到超市管理系统的数据库中。为了方便你理解,我挑选了 1 个有代表性的表来举例说明。
进货单表(import):
这个表中的字段很多,包含了各种信息,表里的数据量也很惊人。我们刚拿到这个表的时候,光是打开表这个操作,就需要等十几秒。
仔细一看,发现表里重复的数据非常多:比如第一行和第二行的数据,同样是 3478 号单据,供货商编号、供货商名称和仓库,这 3 个字段的信息完全相同。可是这 2 条数据的后半部分又不相同,因此,并不能认为它们是冗余数据而删除。
其实,造成这种问题的原因是这张表的设计非常不合理,大量重复导致表变得庞大,效率极低。
在我们的工作场景中,这种由于数据表结构设计不合理,而导致的数据重复的现象并不少见,往往是系统虽然能够运行,承载能力却很差,稍微有点流量,就会出现内存不足、CUP 使用率飙升的情况,甚至会导致整个项目失败。
所以,高效可靠的设计是提升数据库工作效率的关键。那该怎么设计呢?有没有什么可以参考的设计规范呢?自然是有了。
接下来,我就带你重新设计一下刚刚的进货单表,在这个过程中给你具体介绍一下数据表设计的三大范式,分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF),这些范式可以帮助我们设计出简洁高效的数据表,进而提高系统的效率。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

数据库设计的范式是数据库设计中的重要概念,能够帮助提高系统效率和可靠性。本文介绍了数据表设计的三大范式:第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。作者以进货单表为例,详细讲解了如何通过范式设计来消除冗余,实现高效存取。 在第一范式中,作者强调了字段的基本数据字段不可进一步拆分的要求,并通过拆分“property”字段为“specification”和“unit”来满足这一要求。在第二范式中,作者通过拆分表并确定主键,将数据表拆分成了三个表,保证每个表都满足第二范式的要求。在第三范式中,作者进一步拆分进货单头表,将其拆解成供货商表和进货单头表,以满足第三范式的要求。 通过这些范式的设计,作者展示了如何消除数据表中的冗余,提高系统效率。这对于读者来说是一次深入了解数据表设计范式的机会,能够帮助他们更好地理解和应用范式设计原则。 文章还强调了业务优先原则,即技术应该服务于业务需求。作者通过具体案例分析了为什么有时不能简单按照规范要求设计数据表,而是要遵循业务优先的原则。此外,文章还总结了MySQL数据库规范化设计的三个范式,并提出了思考题,引发读者思考和讨论。 总的来说,本文通过具体案例和深入分析,使读者了解了数据库设计的范式规范,以及在设计过程中需要考虑的业务优先原则,为读者提供了宝贵的技术指导和思考题,有助于读者更好地应用数据库设计原则。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 朱晓峰
    置顶
    你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了数据备份。下面是思考题的答案: 修改配置文件my.ini,把secure-file-priv参数改为H: # Secure File Priv. secure-file-priv="H:" 重新启动MySQL服务器
    2021-05-20
  • Skrpy
    老师除法算错了哦,25.5÷34=0.75 这是精确的啊,可以换个数来举例,哈哈哈😄

    作者回复: 非常感谢你的指正,是我疏忽了,已经申请后台修改。

    2021-05-10
    2
    4
  • Michael
    思考题: 我的理解是只能把itemnumber和goodsname拆分出去,其他的都拆分不出去。因为我们结账的时候应该是需要记录当时的价格信息的,这个相当于一个是对当时价格的一个快照,所以只有itemnumber和goodsname能拆分,这个的对应关系不会变。

    作者回复: 请参考思考题答案

    2021-05-07
    1
  • giteebravo
    25.5 ÷ 34 = 0.74 (因为计算结果保留了两位小数)。 所以 “importvalue”“importprice”和“quantity" 冗余的真正原因是字段精度的问题? 除了三个范式以外,竟然还有其他范式的存在,学习了。 --- 思考题答案: 可以把销售流水表中的商品信息(商品编号、商品名称、数量、单价)和会员信息(会员卡号)单独拆分出来,因为它们不直接依赖于表中的主键字段。

    作者回复: 请参考思考题答案

    2021-05-04
    1
  • Nydia
    虽然老师已经说了不能完全简单按照规则来设计表,有些拆分后,会导致sql需要各种关联后查询出结果,不能单表查询,这时又该怎么办呢?比如我有个迭代版本,是挂在某个项目下的,通过项目ID关联,每次查询时都要关联查询项目名,就会说为了方便,迭代多添加项目名称(用mybatis-plus,不用写具体的mybatis中的 sql),也就是违反了第三范式。这种情况怎么处理才好呢?我们现在的项目特别多这种的表结构设计,我一方面觉得违反了约定,一方面又觉得实现上确实方便了些。该如果取舍才好

    作者回复: 不建议这种方式,对后期维护不利,重新设计一下吧。

    2021-11-10
  • floating
    销售流水表可以拆分成三张表: 1、transcationnumber、transcationno、itemnumber、salesvalue、cardnumber 2、itemnumber、goodsname、quantity、price 3、cardnumber、cardno

    作者回复: 请参考思考题答案

    2021-05-13
  • 相信光变成光
    表一:商品编号(itemnumber) 商品名称(goodsname) 价格(price) 表二:流水单号(transactionno)商品编号(itemnumber) 数量(quantity)销售额(salesvalue) 表三:流水单号(transactionno)卡号(cardno) 老师,我这样对吗
    2022-09-14归属地:北京
  • 相信光变成光
    老师,这个算错了吧??25.5÷34=0.74 元,应该是等于0.75
    2022-09-14归属地:北京
  • 小pawn爷
    25.5÷34=0.75什么时候修复
    2022-08-09归属地:湖南
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部