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, 数量)

转载于:https://www.cnblogs.com/soundcode/p/7249363.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring3向Spring4升级过程中quartz修改

为什么80%的码农都做不了架构师?>>> 问题 nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name ... 原因 org.spri…

Socket编程知识必学/SELECT 编程

Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些…

EasyUI--messager

1.    alert 方法 <script type"text/javascript">$( function(){$.messager.alert("调用messager","文本内容") ;});</script> 这里还可以通过icon添加相应的图标及info加入回调函数 <script type"text/javascript&quo…

ROS与navigation教程——基本导航调整指南

说明&#xff1a; 介绍如何调整机器人上的ROS导航包 步骤&#xff1a; (1) 机器人导航需要那些准备? 在调整新机器人上的导航包时遇到的大部分问题都在本地规划器调谐参数之外的区域。机器人的里程计&#xff0c;定位&#xff0c;传感器以及有效运行导航的其他先决条件常常…

小程序跨行跨列多列复杂表格实现

今天来实现个跨行跨列多列表格。 如图&#xff0c;这是个列数不确定&#xff0c;有的单元格还要跨行跨列的复杂表格。 这里暂时最多支持4列&#xff0c;列数再多就放不下了。 实现原理 实现原理比较简单&#xff0c;通过多个嵌套的循环将数据取出。 上面的例子中&#xff0c;最…

Redis学习第八课:Redis高级实用特性(一)

Redis高级实用特性 注&#xff1a;我学习的环境是vmware7.1 ubantu10.10 redis 3.0.2 1、安全性 设置客户端连接后进行任何其他指定前需要的密码。因为redis速度相当快&#xff0c;一个外部用户可以在一秒钟进行很多次的密码尝试&#xff0c;这就需要设定非常强大的密码来防止…

分布式缓存的面试题9

1、面试题 如何保证缓存与数据库的双写一致性&#xff1f; 2、面试官心里分析 你只要用缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性问题&#xff1f; 3、面试题剖析…

ROS与navigation教程——概述

navigation是ROS的二维导航功能包&#xff0c;简单来说&#xff0c;就是根据输入的里程计等传感器的信息流和机器人的全局位置&#xff0c;通过导航算法&#xff0c;计算得出安全可靠的机器人速度控制指令。 代码库&#xff1a;https://github.com/ros-planning/navigation 代…

Linux下c开发 之 线程通信与pthread_cond_wait()的使用

pthread_cond_wait() /************pthread_cond_wait()的使用方法**********/pthread_mutex_lock(&qlock); pthread_cond_wait(&qready, &qlock);pthread_mutex_unlock(&qlock);/*****************************************************/The mutex passed …

ROS与navigation教程——ACML参数配置

<launch> <!--//后为wiki官网的参数说明 &#xff08;&#xff09;中为粗读算法参数说明及理解 面临的问题常用地图有2种&#xff1a;1.基于特征&#xff0c;仅指明在指定位置&#xff08;地图中包含的对象的位置&#xff09;的环境的形状。特征表示使得调节对象的位置…

【设计模式】单例模式 Singleton Pattern

通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例&#xff08;Instance&#xff09; 的情况&#xff0c; 比如说我们想做一计数器&#xff0c;统计某些接口调用的次数&#xff0c;通常我们的数据库连接也是只期望有一个实例。Windows系统的系统任务管理器…

修改输入框placeholder的默认样式

一般网页中都用到input的placeholder属性&#xff0c;想让这个默认样式和网页保持一致&#xff0c;就需要重新设定样式&#xff0c;百度百度&#xff1a; :-moz-placeholder { / color: #000; opacity:1; }支持/* Mozilla Firefox 4 to 18 * ::-moz-placeholder { color: #000;…

进程及线程通信总结

上文我们介绍了如何建立一个简单的多线程程序&#xff0c;多线程之间不可避免的需要进行通信 。相比于进程间通信来说&#xff0c;线程间通信无疑是相对比较简单的。 首先我们来看看最简单的方法&#xff0c;那就是使用全局变量&#xff08;静态变量也可以&#xff09;来进行通…

ROS multi-master——multimaster_fkie配置

多主站ROS配置和mutimaster_fkie ROS版本&#xff1a;kinetic 操作系统&#xff1a;Ubuntu 16.04。 multimaster_fkie&#xff1a;github 1网络配置 1.1路由器 设置无线路由器并连接两台计算机/机器人。为这两台计算机设置静态IP地址。相互测试ping命令和ssh。 1.2主机 …

Docker入门

1. Docker简介: docker是一个基于LXC的高级容器引擎。简单地说&#xff0c;docker是一个轻量级的虚拟解决方案&#xff0c;或者说它是一个超轻量级的虚拟机&#xff08;容器&#xff09;。 Docker是一个开源的引擎&#xff0c;可以轻松的为任何应用创建一个轻量级的、可移植的、…

乐器库的混合

每台微机一个声卡&#xff0c;也就是一片D/A&#xff0c;驱动按波特率、采样位数、采样通道传输给D/A&#xff0c;输出模拟音频。播放时仅一种与硬件支持格式对应&#xff0c;其他需驱动&#xff08;有损&#xff09;变换到硬件支持格式。每个应用都可单独播放声音&#xff0c;…

kafka认知--(1)

文档参考&#xff1a;http://kafka.apache.org/documentation.html 下载代码&#xff1a; tar -xzf kafka_2.11-0.11.0.0.tgz cd kafka_2.11-0.11.0.0 启动 bin/zookeeper-server-start.sh config/zookeeper.properties 创建topic&#xff08;主题为test&#xff0c;只有一个分…

带头尾指针的list的C实现

一、缘起 很早写了一个带头尾指针的list&#xff0c;该list支持从尾部插入元素&#xff0c;在任意位置删除元素&#xff0c;最近用这个list时发现一个bug&#xff0c;修正了&#xff0c;并加了几个接口函数。贴出来&#xff0c;希望对C的初学者有用。 二、基本说明 2.1、数据结…

Gmapping——从原理到实践

概述 在SLAM中&#xff0c;机器人位姿和地图都是状态变量&#xff0c;我们需要同时对这两个状态变量进行估计&#xff0c;即机器人获得一张环境地图的同时确定自己相对于该地图的位置。我们用x表示机器人状态&#xff0c;m表示环境地图&#xff0c;z表示传感器观测情况&#xf…

关于git分支

1.关于git分支 git的“分支”乍一听是一个特别容易让人产生错觉的概念&#xff0c;以为它和树枝一样是分叉的枝节&#xff0c;其实Git中的分支本质上是个指向commit对象的指针,每次commit&#xff0c;git都把它们串成一条时间线&#xff0c;这条时间线就是一个分支。 2.直接切换…