什么是范式?
简言之就是,在进行数据库设计时,建立科学的数据库规范,用来优化数据数据存储方式,在关系型数据库中这些规范就可以称为范式。
第一范式
第一范式(First Normal Form),简称1NF,强调的是列的原子性,即列不能够再分成其他几列。
举一个例子,如下图所示:
上图的地址列就不是原子性的,还可以细分,细分后,如下图所示(绿色部分):
地址列,被拆解为国家和城市两个列,这样的改造就符合了第一范式。
一句话总结:第一范式强调的是列的原子性,即列不能够再分成其他几列,比如:上图的国家Country,城市 City,已经不可再分割,则满足第一范式1NF。
第二范式
第二范式(Second Normal Form),简称2NF,就是指每个表必须有主关键字Primary key,而且每个非主属性完全依赖于主键,而不是仅依赖于其中一部分属性。
还是举例说明,这样更加容易理解第二范式,如下图所示:
上图的订单表就不满足第二范式,因为第二范式要求每个表必须有主关键字Primary key,而且每个非主属性完全依赖于主键,上图红色标识出现了2个主关键字。
所以上图订单表,还可以拆分为两张独立的表:订单表和商品表,拆分后如下图所示:
订单表:
商品表:
简要总结:第二范式就是每张表只描述一件事情,先满足第一范式,另外包含两部分内容,一是表必须有一个主键,二是每个表都强依赖于其主关键字,而不能只依赖于主键的一部分。
第三范式
第三范式(Third Normal Form),简称3NF,就是指表中的所有数据元素不但要能唯一地被主关键字所标识,而且它们之间还必须相互独立,不存在其他的传递依赖关系。
第三范式具有如下特征:
- 每一列只有一个值每一行都能区分;
- 每一个表都不包含其他表已经包含的非主关键字信息。
如下图所示:
上图的订单表中的顾客名称,就不符合第三范式,因为它存在了对非主键顾客编号的依赖,每一个表都不包含其他表已经包含的非主关键字信息。
改进后,去掉顾客名称,就符合第三范式了,如下图所示:
简要总结:第三范式满足第二范式,并且表中的列不存在对非主键列的传递依赖。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》