简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的数据库是需要满足一些规范来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。
如果范式学的不好或者理解的不明白那么设计出来的表,那叫一个难用,并且可扩展性差,性能慢,数据冗余…,导致后期开发成本以及代价都响应的增加,举个例子:
问题:
以上问题不是不能去完成,但是良好的数据库设计能让这个过程,变得简单,性能更加的高效,那么我们接下来学习一下三大范式,
注意: 一切范式的基础都是建立在业务上的,在必要的时候是能违反范式的规则的
第一范式是最基本的范式。如果数据库表中的 所有字段值都是不可分解的原子值,就说明该数据库满足第一范式
第一范式的合理遵循需要根据系统给的实际需求来确定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成为一个数据库表的字段就行,但是如果系统经常访问“地址”属性中的“城市”部分,那么一定要把“地址”这个属性重新拆分为省份、城市、详细地址等多个部分来进行存储,这样对地址中某一个部分操作的时候将非常方便,这样设计才算满足数据库的第一范式。如下图。
拆分前:
拆分后:
上图所示的用户信息遵循第一范式的要求,这样对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能
第二范式在第一范式的基础上更进一层,第二范式需要确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下图。
这里产生一个问题:这个表中是以订单编号和商品编号作为联合主键,这样在该表中商品名称、单位、商品价格等信息不与该表的订单编号主键相关
,而仅仅是与商品的编号相关,所以在这里违反了第二范式的设计原则。
而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了,如下图。
这里这样设计,在很大程度上减小了数据库的冗余,如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
来看上面这个表,看到我框起来的地方吗? 这里是不是感觉上和学号不是一个类型的,这也就是我上面说的表中的列必须和主键直接相关,上表就违反了这个规则,那么我们该怎么处理呢? 我们可以将上表拆分成学生表
和学院表
这样我们在查询的时候,如果只需要学生的信息的话,我们只需要查询学生表就行了,大大的减少了数据的冗余,提高了查询速度, 因为单表的数据越多那么增删改查的速度都会相应的降低,因为构建和查询索引是需要时间的,而且增加了磁盘的io…连表…太多了这就不一一叙述了
点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_45203607/article/details/124881711
内容来源于网络,如有侵权,请联系作者删除!