Mysql 范式总结

三范式理论

第一范式

1NF,原子性,即表的列的具有原子性,不可再分解,即列的信息,不能分解。只要数据库是关系型数据库,就自动的满足1NF

第二范式

2NF,是在第一范式的基础上建立起来的,即必须先满足第一范式。第二范式要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要我们设计一个主键来实现(这里的主键不包含业务逻辑)

第三范式

3NF,必须先满足第二范式。第三范式要求一个数据库表中不包含已在其它表中已包含的非主键字段。就是说,表的信息如果能够被推导出来,就不应该单独的设计一个字段来存放(能尽量外键join就用外键join)
很多时候,我们为了满足第三范式往往会把一张表分成多张表
另外,范式不是绝对要求,有时候我们为了数据的使用方便(范式等级越高,数据冗余越低,但查询成本越高),还会(需要)故意违反范式

结合例子讲解范式

一些名词概念

首先需要了解一些范式相关的名词概念

复合主键

由多个字段构成主键,例如:课程表中的老师+班级构成的主键

依赖/部分依赖/传递依赖
  • 依赖:A字段可以确定B字段,则B字段依赖A字段,例如:性别依赖老师
  • 部分依赖:复合主键A的某个字段可以确定B字段,则B字段部分依赖A字段,例如:性别依赖【老师+班级】的复合主键
  • 传递依赖:C字段依赖B字段,B字段依赖主键A,例如:性别依赖老师,老师依赖id,则性别传递依赖id
第一范式

满足原子性(一个字段就存一种内容)就是第一范式(基本上默认都满足)

第二范式

第一范式的基础上消除对主键的部分依赖,例如下表:

老师 性别 班级 ...

假如此时主键是【老师+班级】,性别对老师有部份依赖,那么就应该改成:

id 老师 性别 班级 ...

此时主键是id,没有了部分依赖,因此符合第二范式

第三范式

第二范式的基础上消除对主键的传递依赖,例如下表:

id 老师 性别 班级 ...

假如此时主键是id,老师依赖id,性别传递依赖id,那么就可以新建一个表存放老师信息,而原表则不存放老师信息,如:

原表
id 老师 班级 ...
教师表
id 老师 性别

此时原表没有了性别,消除了传递依赖,而性别字段则放到新建的教师信息表里,满足第三范式

三范式总结
  • 数据独立、表独立
  • 表中存在与业务逻辑无关的ID主键
  • 表之间的关系由关联字段进行表示
范式优劣
优势
  • 减少数据冗余
  • 易于维护更新(例如第三范式示例中,一开始老师的性别没有提取出来,假如某个老师性别变了,那么这个老师的数据里每一行的性别都得改。但是将性别提到教师表以后,那么只需要改一次教师表里的性别就可以了)
劣势
  • 过于追求范式,容易使得检索成本提高

例子参考

https://www.cnblogs.com/wsg25/p/9615100.html

表关系-ER图-范式关系参考

https://blog.csdn.net/lovecuidong/article/details/87805549

第一范式到第四范式参考

https://blog.csdn.net/wypersist/article/details/80107876

你可能感兴趣的:(Mysql 范式总结)