MySQL 理解三范式和简单理解逆范式

什么是MySQL三大范式?

  • 第一范式:1NF是对属性的原子性,要求属性具有原子性,不可再分解
  • 第二范式:2NF是对记录的唯一性,要求记录有唯一标识,即实体唯一性,即不存在不分依赖
  • 第三范式:3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖

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

第一范式是最基本的范式,如果数据库表中的所有字段值都是不可分解的原子值,就说明数据库表满足了第一范式
第一范式的合理遵循需要根据系统的实际需求来定,比如某些数据库系统中需要用到"地址"这个属性,本来直接将"地址"属性设计成一个数据库表的字段就行,但是如果系统经常访问"地址"属性中的"城市"部分,那么就非要将"地址"这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样对地址中某一部分操作的时候将会非常方便,这样设计才算满足了数据库的第一范式

第一范式强调的是列的原子性,也就是列不能再被分割,如电话列可进行拆分–家庭电话,公司电话

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

第二范式在第一范式的基础上更进一层,第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对复合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的复合主键

第二范式首先要满足第一范式,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖主键的一部分

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

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关
比如在设计一个订单数据表的时候,可以将客户端号作为一个外键和订单表建立相应的关系,而不可以在订单表中添加关于客户的其他信息(比如姓名,所属公司等)的字段

==第三范式首先满足第二范式,目标是确保每列都和主键列直接相关,而不是间接相关(另外非主键列必须直接依赖于主键,不能存在传递依赖)
第三范式可以着迷理解:订单表(订单编号,定购日期,顾客编号,顾客姓名……),初看时该表没有问题,满足第二范式,每列都和主键列"订单编号"相关,再细看就会发现"顾客姓名"和"顾客编号"相关,"顾客编号"和"订单编号"又相关,最后经过传递依赖,"顾客姓名"也和"订单编号"相关。为了满足第三范式,应该去掉"顾客姓名"列,放到客户表中

简单理解逆范式

逆范式指的就是通过增加冗余或重复的数据来提高数据库的读性能
例如在上例中的订单表中把"顾客姓名"也加在订单表中,这样可以减少在关联查询时联表的次数,提供性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值