三大范式

mac2024-05-24  40

数据库的三大范式

第一范式

概念:每列的数据必须保证其原子性,即每列的数据必须细化到不可再拆分 案例:

学号姓名班级001张三Java01班002李四Java02班003王五UI01班004赵六产品02班

在上述表中,班级字段存在数据冗余,如果我们想统计Java学科的人数或者01班级的人数岂不是很尴尬?根据第一大范式条件必须保证每一列数据的原子性,我们可细化分如下:

学号姓名学科班级001张三Java01班002李四Java02班003王五UI01班004赵六产品02班

第二范式

概念:在满足第一范式的条件下,每一列的数据都完全依赖于主键,不产生局部依赖,每张表都只描述一件事物 案例:

学号姓名年龄商品id商品名称商品价格001张三21110笔记本电脑4999002李四22111华为手机2499

根据第二大范式,表中的数据不能产生局部依赖,上述表中很明显姓名、年龄是依赖于学号的,而商品名称、商品价格是依赖于商品id的,表设计中存在局部依赖,并且一张表中描述了两个事物 根据第二范式细化:拆分成一张学生表和一张商品表 学生表:

学号姓名年龄001张三21002李四22

商品表:

商品id商品名称商品价格110笔记本电脑4999111华为手机2499

第三范式

概念:在满足第二范式的条件下,表中的每一列不存在传递依赖,每列都直接依赖于主键 案例:

编号姓名年龄部门名称部门地点001张三21研发部南昌002李四22运营部九江

根据第三范式,每一列应该直接依赖于主键 我们应该拆分成一张用户表和一张部门表,通过建立外键来建立两表之间的关系 员工表:

编号姓名年龄部门编号001张三21001002李四22002

部门表

部门id部门名称部门地点001研发部南昌002运营部九江

反范式化

一般我们设计表都会按照数据库的三大范式,但是在某些情况下我们查询的数据在多张表中,例如我们需要查询员工的信息并且希望带出员工的部门名称,这个时候我们必须使用join关联表查询,如果这些数据是查询非常频繁的,那么无疑会降低数据库的读性能 反范式设计表:

编号姓名年龄部门名称001张三21研发部002李四22运营部

此时数据都在一张表,查询也不用join关联查询,以此提高读取性能

最新回复(0)