数据库设计的三范式

第一范式

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

不符合第一范式的示例

学生编号

学生姓名

联系方式

1001

张三

zs@gmail.com,1359999999

1002

李四

ls@gmail.com,13699999999

1001

王五

ww@163.net,13488888888

存在问题:

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

学生编号(pk)

学生姓名

email

联系电话

1001

张三

zs@gmail.com

1359999999

1002

李四

ls@gmail.com

13699999999

1003

王五

ww@163.net

13488888888

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

第二范式

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

示例:

学生编号

学生姓名

教师编号

教师姓名

1001

张三

001

王老师

1002

李四

002

赵老师

1003

王五

001

王老师

1001

张三

002

赵老师

确定主键:

学生编号(PK)

教师编号(PK)

学生姓名

教师姓名

1001

001

张三

王老师

1002

002

李四

赵老师

1003

001

王五

王老师

1001

002

张三

赵老师

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

解决方案如下:

学生信息表

学生编号(PK)

学生姓名

1001

张三

1002

李四

1003

王五

教师信息表

教师编号(PK)

教师姓名

001

王老师

002

赵老师

教师和学生的关系表

学生编号(PK)  fkà学生表的学生编号

教师编号(PK) fkà教师表的教师编号

1001

001

1002

002

1003

001

1001

002

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

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

第三范式

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

学生编号(PK)

学生姓名

班级编号

班级名称

1001

张三

01

一年一班

1002

李四

02

一年二班

1003

王五

03

一年三班

1004

03

一年三班

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

学生信息表

学生编号(PK)

学生姓名

班级编号(FK)

1001

张三

01

1002

李四

02

1003

王五

03

1004

03

班级信息表

班级编号(PK)

班级名称

01

一年一班

02

一年二班

03

一年三班

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

三范式总结

第一范式:有主键,具有原子性,字段不可分割

第二范式:完全依赖,没有部分依赖

第三范式:没有传递依赖

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

一对一设计,有两种设计方案:

第一种设计方案:主键共享

第二种设计方案:外键唯一

三十二、数据库设计的三范式【完】相关推荐

  1. FreeSql (三十二)Aop

    FreeSql AOP 已有的功能介绍,未来为会根据用户需求不断增强. 审计 CRUD 马云说过,996是修福报.对于多数程序员来说,加班是好事...起码不是闲人,不会下岗. 当如果因为某个 sql ...

  2. 数据库设计的三范式和反范式

    数据库设计的三范式和反范式 范式的概念 三范式 范式一 范式二 范式三 反范式 总结 范式的概念 为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式 ...

  3. 【Visual C++】游戏开发笔记三十二 浅墨DirectX提高班之一 DirectX大局观认知篇

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:  http://blog.csdn.net/zhmxy555/article/details/8172615 作者:毛星云(浅 ...

  4. axi dma 寄存器配置_FPGA Xilinx Zynq 系列(三十二)AXI 接口

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  5. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  6. python建站部署_SpringBoot入门建站全系列(三十二)接入xxl-job分布式任务调度平台...

    SpringBoot入门建站全系列(三十二)接入xxl-job分布式任务调度平台 一.概述 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源 ...

  7. NeHe OpenGL第三十二课:拾取游戏

    NeHe OpenGL第三十二课:拾取游戏 拾取, Alpha混合, Alpha测试, 排序: 这又是一个小游戏,交给的东西会很多,慢慢体会吧   欢迎来到32课. 这课大概是在我所写作已来最大的一课 ...

  8. 计算机网络(三十二)网络管理

    计算机网络(三十二)网络管理 1.SNMP 2.MIB 3.RMON 1.SNMP 是一款基于UDP/IP的协议 . 在TCP/IP的网络管理中可以使用SNMP(Simple Network Mana ...

  9. 静态树表查找算法及C语言实现,数据结构算法C语言实现(三十二)--- 9.1静态查找表...

    一.简述 静态查找表又分为顺序表.有序表.静态树表和索引表.以下只是算法的简单实现及测试,不涉及性能分析. 二.头文件 /** author:zhaoyu date:2016-7-12 */ #inc ...

最新文章

  1. 浏览器对象模型:window对象2
  2. 【原创】SSRS (SQL Serve Reporting Service) 访问权限的问题
  3. golang中的base64
  4. 安卓9.0刷linux,Ubuntu系统下编译Android 9.0系统
  5. arm linux gcc fpic,【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义
  6. The xxx collides with a package/type
  7. 如何在Android上显示警报对话框?
  8. LeetCode 437. 路径总和 III
  9. LintCode 合并二维数组
  10. 考研:研究生考试(十五天学完)之《高等数学-上册/下册》研究生学霸重点知识点总结之目录(函数与极限、导数与微分、微分中值定理与导数、不定积分、定积分及其应用、微分方程、空间解析几何与向量代数、多元函数
  11. PHP开源CRM客户管理系统源码介绍分享
  12. 等价类划分法写测试用例练习
  13. 基于STM32分析内存分布图
  14. SQL Server 2008 创建标量值函数、存储过程
  15. Facebook创始人:不穿袜子的亿万富翁
  16. 我的世界整合包 云服务器搭建方法(ECS)
  17. 什么是数据分类分级?
  18. 计算机文字录入ppt,计算机基础—文字录入.ppt
  19. 改进后的A星三维路径规划完整算法(matlab语言)
  20. mysql数据库表卡死怎么办

热门文章

  1. php判断是否已关注,php判断用户是否关注微信订阅号或公众号
  2. 无法安装mysql server 2008_Windows Server2008安装mysql5.6出现程序无法正常启动(0xc000007b)...
  3. ssh mysql 警告_ssh 对数据表查询出错。警告: SQL Error: 1064, SQLState: 42000
  4. java由goto_在java中goto的目的
  5. 速度前瞻运动控制c语言程序_整合实时运动控制及多颗相机连接,大幅提升光学影像检测速度...
  6. 当程序员产崽后...
  7. ​每日一皮:​你的Frozen Throne...
  8. 这个神器竟然能分分钟将多个 kubeconfig 合并成一个!
  9. zookeeper-一个关于paxos的故事
  10. mysql选择行_在mysql中选择特殊行