gpt4 book ai didi

数据库的三大范式(重要)

转载 作者:知者 更新时间:2024-03-13 17:50:03 27 4
gpt4 key购买 nike

什么是范式?

简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的数据库是需要满足一些规范来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。

如果范式学的不好或者理解的不明白那么设计出来的表,那叫一个难用,并且可扩展性差,性能慢,数据冗余…,导致后期开发成本以及代价都响应的增加,举个例子:

问题:

  1. 如果让你查询9年级的同学一共有多少人你会怎么查询?
  2. 假设现在有1万个学生,现在学校新加了一个课程,但是只给综合成绩大于80分的学生,那么该怎么去存储?
  3. 现在某一门课程涨价了,那么我们该怎么去修改数据?
  4. 等等…

以上问题不是不能去完成,但是良好的数据库设计能让这个过程,变得简单,性能更加的高效,那么我们接下来学习一下三大范式,

注意: 一切范式的基础都是建立在业务上的,在必要的时候是能违反范式的规则的

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

第一范式是最基本的范式。如果数据库表中的 所有字段值都是不可分解的原子值,就说明该数据库满足第一范式

第一范式的合理遵循需要根据系统给的实际需求来确定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成为一个数据库表的字段就行,但是如果系统经常访问“地址”属性中的“城市”部分,那么一定要把“地址”这个属性重新拆分为省份、城市、详细地址等多个部分来进行存储,这样对地址中某一个部分操作的时候将非常方便,这样设计才算满足数据库的第一范式。如下图。

拆分前:


拆分后:

上图所示的用户信息遵循第一范式的要求,这样对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能

第二范式(确保表中的每列都和主键相关)

第二范式在第一范式的基础上更进一层,第二范式需要确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下图。

这里产生一个问题:这个表中是以订单编号和商品编号作为联合主键,这样在该表中商品名称、单位、商品价格等信息不与该表的订单编号主键相关,而仅仅是与商品的编号相关,所以在这里违反了第二范式的设计原则。

而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了,如下图。

这里这样设计,在很大程度上减小了数据库的冗余,如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。

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

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。


来看上面这个表,看到我框起来的地方吗? 这里是不是感觉上和学号不是一个类型的,这也就是我上面说的表中的列必须和主键直接相关,上表就违反了这个规则,那么我们该怎么处理呢? 我们可以将上表拆分成学生表学院表

这样我们在查询的时候,如果只需要学生的信息的话,我们只需要查询学生表就行了,大大的减少了数据的冗余,提高了查询速度, 因为单表的数据越多那么增删改查的速度都会相应的降低,因为构建和查询索引是需要时间的,而且增加了磁盘的io…连表…太多了这就不一一叙述了

点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com