数据库设计三大范式
三大范式
什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。
- 表中的所有字段不可再分
- 表中必须存在业务主键,并且非主键依赖于全部业务主键
- 表中的非主键列之间不能相互依赖
第一范式
表中的所有字段不可再分
假设用户表包含上述属性,联系方式这一属性又包含了手机、固话、邮箱 3个属性,那么联系方式就是一个复合属性。
是一个可再分的属性,可分为手机、固画…三个属性,那么就符合第一范式。
我们可以将属性拆分为:
如果一个数据表满足第一范式那么这个表就是一个标准的二维表!
第二范式
表中必须存在业务主键,并且非主键依赖于全部业务主键
假设存在一笔记表。为了标记出每一条记录的唯一性,我们必须设置一个主键。
这里我们可以采用用户、章节、标题来做一个组合主键,这样做看似是合理的,其实并不符合第二范式。
就是用户积分这一属性,它不依赖于组合主键,而是依赖于用户(用户 -> 用户积分)而不是(笔记 - > 用户积分)。
那我们就可以把用户属性抽取出来,单独一张用户表。
第三范式
表中的非主键列之间不能相互依赖
假设存在一课程表,主标题作为主键。
它是不符合第三范式的,讲师职位依赖于讲师(讲师职位->讲师),这张表可以进一步“窄化”
后语
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。
如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。
如,报表之类的需求,就没必要窄化数据表,可以采用
宽表模式
,可以加快查询速度,也不用写连接的sql语句。
宽表模式:由于把不同的内容都放在同一张表存储,宽表已经不符合三范式的模型设计规范,随之带来的主要坏处就是数据的大量冗余,与之相对应的好处就是查询性能的提高与便捷。