SQL三大范式三个例子搞定

第一范式(1NF)

(必须有主键,列不可分)

数据库表中的任何字段都是单一属性的,不可再分

create table aa(id int,NameAge varchar(100))
insert aa values(1,‘‘无限-女‘‘)
没有达到第一范式

create table aa(id int,name varcahr(10),age char(2))
insert aa values(1,‘‘无限‘‘,‘‘女‘‘)
达到第一范式

第二范式(2NF)

数据库表中非关键字段对任一候选关键字段的 都不存在部分函数依赖

(当一个表是复合主键时,非主键的字段不依赖于部分主键(即必须依赖于全部的主键字段))

create table sci(

sno int(32),cno int(32),grade int(32),credit int(32),

primary key sno,cno

)

课程(cno)1---1学分(credit)

学生(sno)n---n课程(cno)

学生+课程--->分数(grade)

sci

sno cno grade credit

1    1   60     80

2    1    90     80

3   1    70     80

.   .   .      .

.   .   .     .

.    .   .     .

如此以来,学分被大量重复存储,数据冗余

如要某课程学分,则要大量重复操作

如要加新课程,由于sno和cno共同做为主键,则在加入新课程时,必须有人选该课

如某学生某课程结业,则该学生其它课程信息也同时被删除了

总之

这种设计不太好吧,非关键字属性credit仅函数依赖于cno,也就是credit部分依赖组合关键字(sno,cno)而不是完全依赖

解决

分成两个关系模式 sc1(sno,cno,grade),c2(cno,credit)。新关系包括两个关系模式,它们之间通过sc1中的外关键字cno相联系,需要时再进行自然联接,恢复了原来的关系

第三范式(3NF)

关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖

例----S1(SNO,SNAME,DNO,   DNAME, LOCATION)

学号 姓名   所在系 系名称 系地址
关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。
原因:关系中存在传递依赖造成的。即SNO 1->1 DNO。 而DNO 1->n SNO却不存在,而DNO -> LOCATION存在, 因此关键辽 SNO 对 LOCATION 函数决定是通过传递依赖 SNO -> LOCATION 实现的。也就是说,SNO不直接决定非主属性LOCATION。
解决目地:每个关系模式中不能留有传递依赖。
解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)
注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系

鲍依斯-科得范式(BCNF)

在3NF的基础上,库表中任何字段对任一候选关键字段的传递函数依赖都不存在

仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且管理员1---1仓库;仓库1---n物品。这个数据库表中存在如下决定关系:
  (仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式

解决:

把仓库管理关系表分解为二个关系表:
  仓库管理:StorehouseManage(仓库ID, 管理员ID)
仓库:Storehouse(仓库ID, 存储物品ID, 数量)

时间: 2024-11-09 23:58:48

SQL三大范式三个例子搞定的相关文章

三步轻松搞定delphi中CXGRID手动添加复表头(多行表头,报表头)

网上有代码动态生成cxgrid多行表头的源码,地址为:http://mycreature.blog.163.com/blog/static/556317200772524226400/ 如果要手动设计多行表头的话,有下面三步搞定: 1.新建一个工程.将CXGRID控件放在上面,Customize创建一个banded table 或者DB BANDED table.操作方法一样. 2.增加BANDS 和columns.加两个BANDS和5个columns.这里看下图红框内的内容为默认这个colum

实战栈溢出:三个漏洞搞定一台路由器(转自长亭科技)

转:https://zhuanlan.zhihu.com/p/26271959 背景知识: 1.snprintf(),为函数原型int snprintf(char *str, size_t size, const char *format, ...),将可变个参数(...)按照format格式化成字符串,然后将其复制到str中. 函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值.与snprintf的返回值不同,sprintf的返回值是成功写入的字符串长度,此处需要谨慎处理! 2.st

sql三大范式

一.第一范式: 必须有主键,列不可分. 二.第二范式: 当一个表是复合主键,非主键的字段不依赖于部分主键, 例如: create table sci( sno int(32),cno int(32),grade int(32),credit int(32), primary key sno,cno ) 非关键字属性credit仅函数依赖于cno,也就是credit部分依赖组合关键字(sno,cno)而不是完全依赖. 分成两个关系模式 sc1(sno,cno,grade),c2(cno,credi

三招轻松搞定 教你选择PoE交换机

对于我们来讲,什么样才是最适合我们的产品呢?给摄像头选择PoE交换机是背板带宽越大越好吗?下面,我们就通过如下三个方面帮助大家解开挑选PoE交换机的困惑. 一,合适端口,实用最重要 很多朋友在选择PoE交换机时不停纠端口数量,其实明确自身需求才是最为重要的.比如,有些时候一个百兆4口的PoE交换机就可以满足需求,但是出于心理作用,总喜欢选择端口更多的8口PoE交换机.虽然并不影响系统运行,但是却造成了一定程度的浪费,使得成本也变高,不划算. 二.传输质量,多方面考虑 PoE交换机的好坏,肯定还要

爬虫工程师分享:三步就搞定 Android 逆向

本文源于我近期的一次公司内部分享,通过逆向某款 APP 来介绍逆向过程.由于仅作为学习用途,APP 的相关信息会被遮盖,敬请理解. 关于逆向 逆向--包括但不限于通过反编译.Hook 等手段,来解析一些功能的实现过程. 逆向在很多领域都有应用,比如如今爬虫技术已经遍地走,甚至不用写代码都可以爬取数据,导致前端开发的反爬意识也逐步提升.因此 JS.Android 等领域的逆向,已经成为爬虫开发者必备的技能之一. 本文介绍的是最典型常见的传参加密,在很多应用接口都能见到,如果我们逆向解析出加密过程,

三条代码 搞定 python 生成验证码

C:\Users\DELL>python Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import qrc

iOS imagePicker使用方法,方便使用!三步轻松搞定!

自己总结的修改头像的方法,只为方便自己查询使用!转发 步骤:1.遵守代理协议 <UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIActionSheetDelegate> 2.点击事件{ UIActionSheet *choosePhotoActionSheet; if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSou

怎样翻译word文档中的英文,仅需三分钟即可搞定

怎样翻译word文档中的英文?在职场办公当中,难免会遇到外国客户.在与外国客户沟通.合作的过程当中,所使用得合作文件.资料的内容几乎都是英文.这也就使得英文不好的职员,除了准备合作资料外还需要花费大量时间去查阅单词,翻译语句,大大降低了工作效率.今天小编就将告诉大家如何快速有效地翻译word文档中的英文. 使用工具:迅捷pdf转换https://www.xunjiepdf.com/converter 1.大部分翻译工具,都只能单个单词或者逐句翻译,就算能翻译整段也是有次数限制.这样就会导致翻译出

Spring Boot 集成 Ehcache 缓存,三步搞定!

本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序的数据缓存功能.在Spring Boot应用程序中,我们可以通过Spring Caching来快速搞定数据缓存. 接下来我们将介绍如何在三步之内搞定 Spring Boot 缓存. 1. 创建一个Spring Boot工程 你所创建的Spring Boot应用程序的maven依赖文件至少应该是下面的样子: <?xml version="1.0" encoding="UTF-8"?