数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
1.若将所有的信息放在一个表中,存在的问题:
现在建立一个描述学校教务的数据库,该数据库涉及的对象包括学生的学号(Sno),所在系(Sdept),
系主任姓名(Mname),课程号(Cno)和成绩(Grade)。假设用一个单一的关系模式Student来表示,
则该关系模式的属性集合为:
U={Sno,Sdept,Mname,Cno,Grade}
存在的问题:
数据冗余过大。造成大量的存储空间。(比如在相同的系的各个学号均包含相同的系主任名称)
更新复杂。(比如修改系主任名称,需要修改多行)
插入异常:如果一个系刚成立,尚无学生,就无法将这个系及其系主任存入数据库。
删除异常:如果某个系的学生全部毕业了,删除该系学生信息的同时,把这个系及其系主任的信息也去掉了。
概念:
关系:指包含具体数据的一张具体 表。
关系模式:指表的定义,包含哪些列,及列之间的相互依赖关系等等。是属于一种场景的语义描述。
R(U),R是指的关系模式,U是关系模式上列的集合,X,Y是U的子集。即X,Y是一些列的集合。
函数依赖:如果知道X的值,就一定知道Y的值。记作X->Y。如知道学生的学号,就一定知道学生的姓名。这属于函数依赖。
完全函数依赖:如果x->y,且对于x的任何一个子集x',都有x'不能推导出y,则称y对x完全函数依赖。
比如知道学号及学号对应的系,可以知道学生姓名,这属于部分函数依赖,因为知道学号,就可以知道学生姓名。
部分函数依赖:如果x->y,但y不完全函数依赖于x,则y对于x部分函数依赖。
传递函数依赖:
x->y,y不是x的子集,y不能推导出x,y->z,则称z是x的传递函数依赖。
非平凡的函数依赖:x->y,但y不属于x的子集,是非平凡的函数依赖。
平凡的函数依赖:x->y,且y属于x,则称x->y是平凡的函数依赖。
码:
R<U,F>
U为列的集合,F为函数依赖x
设K为R<U,F>中的属性或者属性集合(即K是一个列或几个列的组合),若K能完全推导出U,
且K的每个子集均不能推导出U,则K为R的候选码(Candidate Key),简称为码。若候选码多于一个,
则选定其中一个为主码。(Primary key)。
包含在任何一个候选码中的属性,称为主属性,不包含在任何码中的属性称为非主属性,
或非码属性。最简单个情况,单个属性是码,极端的情况,整个属性是码.
第一范式(1NF):
列是同质的(即每一个列是同一类型的数据)
不同的列可以出自于同一个域(域即数据类型),不同的属性要给与不同的属性名。
列的顺序无所谓,即列的次序可以任意交换。
任意的两个元组不能相同(即不能存在重复行)
行的顺序无所谓,即行的次序可以任意交换。
分量必须取原子值,即每一个分量都必须是不可分的数据项。
第二范式:
首选满足于第一范式。
且每一个非主属性完全函数依赖于码,即属于第二范式。
第三范式
每一个非主属性不传递依赖于码。
来自于百科介绍:
第一范式:
数据库表的每一列都是不可分割的基本数据项,同一列不能有多个值。
第二范式:
表中每一行必须被唯一的区分,这个唯一属性列被称为主关键字,或者主键,主码。
第二范式要求实体的属性完全依赖于主属性。所谓完全依赖就是指不能存在仅依赖主关键字一部分的属性。
第三范式:
属性不依赖于其他非主属性。
或者说要求一个数据库表中不包含已在其他表中已包含的非主关键字信息。
1.4 鲍依斯-科得范式(BCNF是3NF的改进形式)
若关系模式R是第一范式,且每个属性都不传递依赖于R的候选键。这种关系模式就是BCNF模式。即在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合鲍依斯-科得范式。
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情况:
(1) 删除异常:
当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。
(2) 插入异常:
当仓库没有存储任何物品时,无法给仓库分配管理员。
(3) 更新异常:
如果仓库换了管理员,则表中所有行的管理员ID都要修改。
把仓库管理关系表分解为二个关系表:
仓库管理:StorehouseManage(仓库ID, 管理员ID);
仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。
四种范式之间存在如下关系:
相关推荐
spring 异步编程样例
带有 python 3.7 和 opencv 4.1.0 的 Docker 映像用法docker run -it jjanzic/docker-python3-opencv python>>> import cv2带有标签的图像包含使用contrib 模块:contrib构建的 docker 镜像可用的docker标签列表opencv-4.1.0(latest分支)contrib-opencv-4.1.0(opencv_contrib分支)opencv-4.0.1contrib-opencv-4.0.1opencv-4.0.0contrib-opencv-4.0.0opencv-3.4.2contrib-opencv-3.4.2opencv-3.4.1contrib-opencv-3.4.1opencv-3.4.0contrib-opencv-3.4.0opencv-3.3.0contrib-opencv-3.3.0opencv-3.2.0contrib-opencv-3.2.0
原生js鼠标滑过文字淡入淡出效果.zip
中国各城市、区、县距离港口和海岸线的距离数据集提供了全国各城市及区、县的坐标信息,以及各个港口和海岸线的坐标信息。通过R语言计算,得出了各城市、区县与港口和海岸线之间的距离。该数据集包含了各港口的经纬度、各城市与港口之间的距离、各区县与港口之间的距离、中国各城市质心与港口的最近距离、中国各城市质心与海岸线的距离、中国各区县质心与港口的最近距离以及中国各区县质心与海岸线的距离等指标。此外,还涉及中国各省距离海岸线的距离数据。港口等级划分参考了《全国沿海港口布局规划》,包括上海港、大连港等45个港口。数据集覆盖了全国31个省及直辖市,是研究地理、经济和规划等领域的宝贵资源。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
Python错误集合.doc
《中国全球投资追踪》数据库提供了2005至2023年间中国在全球范围内的投资和合同的详细记录,不包括债券。该数据库由中国海外直接投资(ODI)和建筑合同两大部分组成,覆盖全球多个国家和地区,涉及能源、交通、通信等多个行业领域。这份追踪数据集包含4142条样本,以面板数据格式呈现,主要指标包括年份、月份、投资方、投资量(单位:百万美元)、交易类型、行业、子行业、国家、地区、是否为“一带一路”倡议相关项目、绿地投资等。这份追踪数据是政策制定者、学者、企业和公众理解中国在全球经济中角色的重要资源,有助于分析中国的全球战略和经济目标。
原生js广告代码制作可展开关闭的页面上固定的图片对联广告代码.rar
这组数据涵盖了1999至2020年间中国各地区普通小学毕业生的数量。它为我们提供了一个深入了解中国教育领域中普通小学阶段教育水平和教育资源分配情况的窗口。通过分析这些数据,可以为制定科学合理的教育政策提供依据,同时,通过比较不同城市的普通小学毕业生数,也能为城市规划和劳动力市场调查提供参考。数据来源于中国区域统计年鉴和中国各省市统计年鉴,包含了8472个样本,以面板数据的形式呈现。这些数据对于掌握中国教育态势具有重要的参考价值。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
自写程序
该数据集由草莓照片组成,用于识别成熟的草莓。 图像上标注有边界框,可以准确标出图像中成熟草莓的位置。 该数据集可用于促进草莓生产、质量控制和农业实践的进步以及提高精确度。 数据集结构 图像- 包含草莓的原始图像 框- 包括原始图像的边界框标签 annotations.xml - 包含为原始照片创建的边界框和标签的坐标 数据格式 文件夹中的每张图片都images附有 XML 注释,annotations.xml指示用于检测成熟草莓的边界框的坐标。对于每个点,都提供了 x 和 y 坐标。成熟草莓的可见性也由属性occluded (0, 1) 提供。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
jmw网址导航网站简洁源码.zip
内容概要:本文档旨在带领初学者了解和掌握小程序开发全流程。首先介绍了小程序的特点及其广泛应用场景。随后详细讲解了小程序的项目准备、前端与后端开发、API调用技巧以及测试发布等关键环节。特别是针对微信小程序的特性,给出了许多实用的技术指南。 适用人群:对于想要学习小程序开发的新手开发者尤其有用。 使用场景及目标:帮助读者从零开始构建一个完整的餐饮类微信小程序,涵盖需求分析、功能设计、技术选型、页面搭建、交互逻辑实现、后台服务对接、测试上线等一系列步骤。 其他说明:文中还特别强调了代码调试的重要性,并提供了关于常见错误排查的具体指导,有助于新手解决实际开发过程中遇到的问题。另外,文档末尾附有项目总结和后续维护要点,提醒开发者注意项目完成后的工作事项。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
SiC模块取代IGBT模块的PCS
原生js微信分享到朋友圈浮动层代码.zip
图表效果及代码实现讲解链接:https://blog.csdn.net/zhangjiujiu/article/details/143997013