三十二、数据库设计的三范式【完】
数据库设计的三范式
第一范式
数据库表中不能出现重复记录,每个字段是原子性的不能再分
不符合第一范式的示例
学生编号 |
学生姓名 |
联系方式 |
1001 |
张三 |
zs@gmail.com,1359999999 |
1002 |
李四 |
ls@gmail.com,13699999999 |
1001 |
王五 |
ww@163.net,13488888888 |
存在问题:
- 最后一条记录和第一条重复(不唯一,没有主键)
- 联系方式字段可以再分,不是原子性的
学生编号(pk) |
学生姓名 |
|
联系电话 |
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 |
一年三班 |
以上设计是一种典型的一对多的设计,一存储在一张表中,多存储在一张表中,在多的那张表中添加外键指向一的一方的主键
三范式总结
第一范式:有主键,具有原子性,字段不可分割
第二范式:完全依赖,没有部分依赖
第三范式:没有传递依赖
数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时可能会拿冗余换速度,最终用目的要满足客户需求。
一对一设计,有两种设计方案:
第一种设计方案:主键共享
第二种设计方案:外键唯一
三十二、数据库设计的三范式【完】相关推荐
- FreeSql (三十二)Aop
FreeSql AOP 已有的功能介绍,未来为会根据用户需求不断增强. 审计 CRUD 马云说过,996是修福报.对于多数程序员来说,加班是好事...起码不是闲人,不会下岗. 当如果因为某个 sql ...
- 数据库设计的三范式和反范式
数据库设计的三范式和反范式 范式的概念 三范式 范式一 范式二 范式三 反范式 总结 范式的概念 为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式 ...
- 【Visual C++】游戏开发笔记三十二 浅墨DirectX提高班之一 DirectX大局观认知篇
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8172615 作者:毛星云(浅 ...
- axi dma 寄存器配置_FPGA Xilinx Zynq 系列(三十二)AXI 接口
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...
- OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己
OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...
- python建站部署_SpringBoot入门建站全系列(三十二)接入xxl-job分布式任务调度平台...
SpringBoot入门建站全系列(三十二)接入xxl-job分布式任务调度平台 一.概述 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源 ...
- NeHe OpenGL第三十二课:拾取游戏
NeHe OpenGL第三十二课:拾取游戏 拾取, Alpha混合, Alpha测试, 排序: 这又是一个小游戏,交给的东西会很多,慢慢体会吧 欢迎来到32课. 这课大概是在我所写作已来最大的一课 ...
- 计算机网络(三十二)网络管理
计算机网络(三十二)网络管理 1.SNMP 2.MIB 3.RMON 1.SNMP 是一款基于UDP/IP的协议 . 在TCP/IP的网络管理中可以使用SNMP(Simple Network Mana ...
- 静态树表查找算法及C语言实现,数据结构算法C语言实现(三十二)--- 9.1静态查找表...
一.简述 静态查找表又分为顺序表.有序表.静态树表和索引表.以下只是算法的简单实现及测试,不涉及性能分析. 二.头文件 /** author:zhaoyu date:2016-7-12 */ #inc ...
最新文章
- 浏览器对象模型:window对象2
- 【原创】SSRS (SQL Serve Reporting Service) 访问权限的问题
- golang中的base64
- 安卓9.0刷linux,Ubuntu系统下编译Android 9.0系统
- arm linux gcc fpic,【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义
- The xxx collides with a package/type
- 如何在Android上显示警报对话框?
- LeetCode 437. 路径总和 III
- LintCode 合并二维数组
- 考研:研究生考试(十五天学完)之《高等数学-上册/下册》研究生学霸重点知识点总结之目录(函数与极限、导数与微分、微分中值定理与导数、不定积分、定积分及其应用、微分方程、空间解析几何与向量代数、多元函数
- PHP开源CRM客户管理系统源码介绍分享
- 等价类划分法写测试用例练习
- 基于STM32分析内存分布图
- SQL Server 2008 创建标量值函数、存储过程
- Facebook创始人:不穿袜子的亿万富翁
- 我的世界整合包 云服务器搭建方法(ECS)
- 什么是数据分类分级?
- 计算机文字录入ppt,计算机基础—文字录入.ppt
- 改进后的A星三维路径规划完整算法(matlab语言)
- mysql数据库表卡死怎么办
热门文章
- php判断是否已关注,php判断用户是否关注微信订阅号或公众号
- 无法安装mysql server 2008_Windows Server2008安装mysql5.6出现程序无法正常启动(0xc000007b)...
- ssh mysql 警告_ssh 对数据表查询出错。警告: SQL Error: 1064, SQLState: 42000
- java由goto_在java中goto的目的
- 速度前瞻运动控制c语言程序_整合实时运动控制及多颗相机连接,大幅提升光学影像检测速度...
- 当程序员产崽后...
- ​每日一皮:​你的Frozen Throne...
- 这个神器竟然能分分钟将多个 kubeconfig 合并成一个!
- zookeeper-一个关于paxos的故事
- mysql选择行_在mysql中选择特殊行