MySql--数据库设计三范式

数据库设计三范式

设计数据库表的时候所依据的规范,共三个规范:

第一范式:要求有主键,并且要求每一个字段原子性不可再分
第二范式:要求所有非主键字段完全依赖主键,不能产生部分依赖

第三范式:所有非主键字段和主键字段之间不能产生传递依赖

第一范式

数据库表中不能出现重复记录,每个字段是原子性的不能再分

不符合第一范式的实例:

第一范式1.PNG

存在问题:

最后一条记录和第一条重复(不唯一,没有主键)
联系方式字段可以再分,不是原子性的

第一范式2.PNG

关于第一范式,每一行必须唯一,也就是每个表必须有主键,这是数据库设计的最基本要求,主要采用数值型或定长字符串表示,关于列不可再分,应该根据具体的情况来决定。如联系方式,为了开发上的便利可能就采用一个字段。

第二范式

第二范式是建立在第一范式基础上的,另外要求所有非主键字段完全依赖主键,不能产生部分依赖

实例:

二1.PNG

确定主键:

二2.PNG

以上虽然确定了主键,但此表会出现大量的冗余,主要涉及到的冗余字段为“学生姓名”和“教师姓名”,出现冗余的原因在于,学生姓名部分依赖了主键的一个字段学生编号,而没有依赖教师编号,而教师姓名部分依赖了主键的一个字段教师编号,这就是第二范式部分依赖。

解决:

解决.PNG

如果一个表是单一主键,那么它就是复合第二范式,部分依赖和主键有关系

以上是典型的“多对多”设计

第三范式

建立在第二范式基础上的,非主键字段不能传递依赖于主键字段(不要产生传递依赖)

三1.PNG

上表中,班级名称字段存在冗余,因为班级名称字段没有直接依赖于主键,班级名称字段依赖于班级编号,班级编号依赖于学生编号,这就是传递依赖,解决的办法就是将冗余字段单独拿出来建立表:

解决三.PNG

以上设计是典型的一对多的设计,一存储在一张表中,多存储在一张表中,在多的那张表中添加外键指向一的一方

几个经典的设计:

一对一:

第一种方案:分两张表存储,共享主键
第二种方案:分两张表存储,外键唯一

一对多:

分两张表存储,在多的一方添加外键,
这个外键字段引用一的一方中的主键字段

多对多:

分三张表存储,在学生表中存储学生信息,在课程表中存储课程信息,
在学生选课表中存储学生和课程的关系信息
共享主键.PNG
外键唯一.PNG

实际开发中,数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时可能会拿冗余换速度,最终目的是要满足客户需求

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 回顾 字段类型(列类型):数值型,时间日期型和字符串类型 数值型:整型和小数型(浮点型和定点型) 时间日期型:da...
    翊溪阅读 981评论 0 0
  • 数据库开发规范1. 数据库命名规范前缀对象前缀命名: 前缀命名一般用小写表的前缀: 业务模块组名前缀存储过程前缀:...
    PowerYangSoft阅读 2,542评论 0 8
  • 前面讲了SQL优化以及索引的使用、设计优化了,那么接下来就到表的设计与优化啦!!!真实地去设计优化单表结构以及讲述...
    JackFrost_fuzhu阅读 3,935评论 2 28
  • 1香椿炒鸡蛋 早晨的阳台上有些冷清,透过窗玻璃,看不见往日邻居热火朝天做饭的场景。 同事送我一把香椿,嫩绿的...
    雨田东西阅读 553评论 0 1
  • httpheader上的user属性 加个iv代表跨服务器中获取user值 和request.getHeader(...
    0xmx0阅读 2,483评论 0 0