理解数据库设计范式_选课记录实体中包含学号课程号学生姓名成绩四个属性-程序员宅基地

技术标签: 语言  oracle  出版  Database/Sql  电话  影视  数据库  

第一范式(1NF): 对于表中的每一行,必须且仅仅有唯一的行值;在一行中的每一列仅有唯一的值并且具有原子性。

这个概念的第一句话很好理解,任何人也不会在一张表中存在两个一模一样的记录。关键是第二句话:在一行中的每一列仅有唯一的值并且具有原子性,看如下示例:

比如有一张学生的基本资料表,如下图所示:

学号

学生姓名

学生系部

学生班级

性别

电话

510073238

卜峰

信息工程系

计媒0523

’025858432511381541911013813000000

510073232

姚丽萍

信息工程系

计媒0523

 

510601114

杨雯雯

信息工程系

软件0515

0523-8377089213770525646

410022206

桑旭娟

信息工程系

信管0424

025-8587466213601468109

410022207

王玫

信息工程系

信管0424

0513-8844046013851989926

410022209

张露丽

信息工程系

信管0424

025-85874662

410032231

谭浩

信息工程系

影视0424

51988041182

这个表不符合1NF,因为“电话”字段中的值有多个,可以分割成多个值,不具有原子性,这样带来的问题维护、查询、统计该字段的值很麻烦。

我们通过把重复的字段的值放到独立的表中,把这些表通过一对多关系关联起来消除重复值。可以把上面的表改造成以下两张表,以符合第一范式:

学号

学生姓名

学生系部

学生班级

性别

510073238

卜峰

信息工程系

计媒0523

510073232

姚丽萍

信息工程系

计媒0523

510601114

杨雯雯

信息工程系

软件0515

410022206

桑旭娟

信息工程系

信管0424

410022207

王玫

信息工程系

信管0424

410022209

张露丽

信息工程系

信管0424

410032231

谭浩

信息工程系

影视0424

 

学号

电话

510073238

02585843251

510073238

13813000000

510073238

13815419110

510601114

0523-83770892

510601114

13770525646

410022206

025-85874662

410022206

13601468109

410022207

0513-88440460

410022207

13851989926

410022209

025-85874662

410032231

51988041182

 

第二范式(2NF):要求非主键列是主键的子集,非主键列活动必须完全依赖整个主键。

比如有学生选课表,如果设计成如下情况就违反第二范式:

课程名

学生姓名

学年

学分

课程所用教材

出版社

学生班级

学生性别

C语言

卜峰

2008

4

C语言程序设计

清华大学

软件0515

C语言

姚丽萍

2008

4

C语言程序设计

清华大学

信管0424

C语言

杨雯雯

2008

4

C语言程序设计

清华大学

影视0424

Oracle

卜峰

2008

6

Oracle基础应用

电子工业

软件0515

Oracle

姚丽萍

2008

6

Oracle基础应用

电子工业

信管0424

Oracle

杨雯雯

2008

6

Oracle基础应用

电子工业

影视0424

主键为(课程名,学生姓名)"(学年,学分,课程所用教材,出版社,学生班级,学生性别),

但是(课程名)"(学分,课程所用教材,出版社),即(学分,课程所用教材,出版社)依赖于(课程名);

同样,(学生姓名)"(学生班级,学生性别),即(学生班级,学生性别)依赖于(学生姓名)。

我们把上面的表拆分成三张表,以符合第二范式:

课程名

学生姓名

学年

C语言

卜峰

2008

C语言

姚丽萍

2008

C语言

杨雯雯

2008

Oracle

卜峰

2008

Oracle

姚丽萍

2008

Oracle

杨雯雯

2008

 

课程名

学分

课程所用教材

出版社

C语言

4

C语言程序设计

清华大学

Oracle

6

Oracle基础应用

电子工业

 

学生姓名

学生班级

学生性别

卜峰

软件0515

姚丽萍

信管0424

杨雯雯

影视0424

以后用视图等方式关联解析表内容。

第三范式(3NF): 要求非主键列互不依赖,或者说非主键不能依赖传递。

例如建立的学生基本信息表就不符合3NF

学生姓名

学生班级

学生性别

所属系部

班主任

所属专业

教室

卜峰

软件0515

信息工程系

刘伟

软件开发

304

姚丽萍

影视0424

艺术设计系

王华

影视制作

405

杨雯雯

软件0515

信息工程系

刘伟

软件开发

304

因为(学生姓名)"(学生班级),(学生班级)"(所属系部,班主任,所属专业,教室),但同时(学生姓名)"(所属系部,班主任,所属专业,教室),就有了传递关系。

遇到不符合3NF情况,我们建立“字典表”来使之符合3NF,如把上表拆分成如下两张表,即可符合3NF

学生姓名

学生班级

学生性别

卜峰

软件0515

姚丽萍

影视0424

杨雯雯

软件0515

 

学生班级

所属系部

班主任

所属专业

教室

软件0515

信息工程系

刘伟

软件开发

304

影视0424

艺术设计系

王华

影视制作

405

 

简单的说,
第一范式 :列名要具体到不能再细分。
第二范式: 对于主键有多个列同时担任的表,所有其他列都必须同时依赖担任主键的所有列。
第三范式:不是主键的列不能决定其他的列。

From: http://www.cnblogs.com/njypcmqj/articles/1142868.html

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/guopengzhang/article/details/5015764

智能推荐

国科大高级人工智能10-强化学习(多臂赌博机、贝尔曼)_国科大 强化学习-程序员宅基地

文章浏览阅读1.5k次。文章目录多臂赌博机Multi-armed bandit(无状态)马尔科夫决策过程MDP(markov decision process1.动态规划蒙特卡罗方法——不知道环境完整模型情况下2.1 on-policy蒙特卡罗2.2 off-policy蒙特卡罗时序差分方法强化学习:Reinforcement learning目标:学习从环境状态到行为的映射,智能体选择能够获得环境最大奖赏的行为..._国科大 强化学习

如何用 Visual studio 2003/2005 调试 ASP 应用程序、Javascript 代码(转)_visual studio 2003 asp 远程调试-程序员宅基地

文章浏览阅读1k次。如何用 Visual studio 2003/2005 调试 ASP 应用程序、Javascript 代码 在vs2005中调试ASP网站的错误信息:无法提供此类型的页。说明: 由于已明确禁止所请求的页类型,无法对该类型的页提供服务。扩展名“.asp”可能不正确。 请检查以下的 URL 并确保其拼写正确。 怎么解决这个问题呢?请看下文。 ASP.NET 已经很_visual studio 2003 asp 远程调试

MMO即时战斗:地图角色同步管理和防作弊实现_mmo城镇同步-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏29次。一、前言 无论是端游、页游、手游如果是采用了MMO即时战斗游戏模式,基本都会遇到同屏多角色实时移动、释放技能、战斗等场景,于是自然也需要实现如何管理同屏内各种角色的信息同步:例如角色的位置、以及角色身上的装备、时装、buffer等状态的实时切换。同步在网络游戏中是非常重要的,它保证了每个玩家在屏幕上看到的东西大体是一样的,解决同步问题的最简单的方法就是把每个玩家的_mmo城镇同步

Android Studio JNI代码突然无法跳转_android studio jni 类无法自动跳转-程序员宅基地

文章浏览阅读4.5k次。Android Studio JNI代码突然无法跳转AndroidStudio3.2 + gradle 4.6 下突然无法是用 ctrl + 左键 跳转代码。选中代码点击时出现 “Cannot find declaration to go to” 提示. 经过了换 SDK 后比对发现,如果JNI 代码出现这个问题,一般就是 CMake 版本不对。我换成3.6.xxx就好用了。3.10.xxx不知..._android studio jni 类无法自动跳转

【集成学习-组队学习】3.优化基础模型_模型选择 逐步法-程序员宅基地

文章浏览阅读216次。优化基础模型在回归问题的基本算法中,我们使用数据集去估计模型的参数,如线性回归模型中的参数w,那么这个数据集我们称为训练数据集,简称训练集。我们在回归问题中使用训练集估计模型的参数的原则一般都是使得我们的损失函数在训练集达到最小值,其实在实际问题中我们是可以让损失函数在训练集最小化为0,如:在线性回归中,我加入非常多的高次项,使得我们模型在训练集的每一个数据点都恰好位于曲线上,那这时候模型在训练集的损失值也就是误差为0。那么这样我们的模型是否就可以预测任意情况呢?答案是显然否定的。我们建立机器学习_模型选择 逐步法

程序设计分组训练 实验2实验报告_程序分组训练实验二-程序员宅基地

文章浏览阅读81次。程序设计分组训练 实验2_程序分组训练实验二

随便推点

Android开发之实现搜索框搜索_android搜索框功能实现-程序员宅基地

文章浏览阅读1.6w次,点赞21次,收藏180次。最近自己在尝试做app开发,遇到搜索框功能,便查找了一下但是感觉自己想的或许更好理解和记住,便自己思考了一下。废话不多说,下面是实现代码,供大家参考,有待改进。先说一下我整体思路,因为刚开始写所以相关数据都没有上传服务器过。首先建立一个数据库,将可以搜索的相关内容存储到数据库当中,然后在搜索框中获取输入的第一个字符,..._android搜索框功能实现

【Java虚拟机】JVM垃圾回收机制和常见回收算法原理-程序员宅基地

文章浏览阅读1.8k次,点赞14次,收藏17次。JVM垃圾回收机制和常见回收算法原理_垃圾回收机制

全栈混合云综合架构方案研究和落地_混合云管纳管双活资源池-程序员宅基地

文章浏览阅读493次。经过一年多团队的刻苦攻坚,目前全栈混合云1.0版本的方案已经落地多个场景,包括(政务云,一城一池,企业云,能源云)等多个场景,已经有超过近百个客户的实践经验,未来全栈混合云将从“可纳管”到“智能纳管”全面迭代,整体架构将想云原生的方向进行全面转化。主要部署全栈混合云管理平台,全部采用虚机/容器化部署模式,包括前台web组件, 中台Java组件, 后台的混合云适配组件,缓存Redis组件,RabbitMQ 组件和数据库PXC集群组件等,每个组件采用多活的方式,对外提供服务,降低单点故障。_混合云管纳管双活资源池

【解决windows install问题】如找不到vc_runtimeMinimum_x86.msi,如强制删除软件方法-程序员宅基地

文章浏览阅读169次。其中卸载软件可能卸载不掉,用下面这个软件进行卸载(万能)_vc_runtimeminimum_x86

java核心技术卷1 第11版 勘误表_java核心技术第11版关于takewhile的介绍有错-程序员宅基地

文章浏览阅读505次。11th Edition Volume 1 (Java SE 9 - 11)Page 54Change “Except, of course, when n is negative.” to “Except, of course, when n is odd and negative.”Page 69Change the method names empty and blank to isEmpty and isBlank.Page 69In the API note for the start_java核心技术第11版关于takewhile的介绍有错

前端八股(基于黑马八股文档的二次总结)-程序员宅基地

文章浏览阅读611次,点赞28次,收藏12次。精灵图是把网站上用到的一些图片整合到一张单独的图片中,从而减少你的网站的 HTTP 请求数量,该图片使用 css background 和 background-position 属性渲染,这也就意味着你的标签变得更复杂了,图片是在 css 中定义,并非在1、减少网页的 http 请求,从而加快了网页加载速度,提高用户体验2、减少图片的体积,因为每个图片都有一个头部信息,把多个图片放到一个图片里,就会共用同一个头信息,从而减少了字节数。