数据库设计——关系数据理论(超详细)

2023-10-26

?问题——什么是一个好的数据库逻辑设计?

●关系型数据库逻辑设计:
➠针对一个具体问题应如何构造一个适合于它的数据模式,即应构造几个关系,每个关系由哪些属性组成等
eg:
在这里插入图片描述

?这样的设计是一个好的设计吗 ?

观察这个表所对应的一个实例(在某个时刻student模式所对应的一个实际的数据情况):如有若干个学生,他们都为’计算机系’,系主任为’张明’,选修了’C1’课程,得到各自的成绩

在这里插入图片描述

☞关系模式STUDENT(Sno,Sdept,Mname,Cno,Grade)中存在的问题:☜
1、数据冗余太大,浪费存储空间

如:系主任的名字重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。

2、更新异常(Update Anomalies)
数据冗余,更新数据时,维护数据完整新代价大
如果某系换主任,系统必须修改与该系学生有关的每一个元组。

3、插入异常(Insertion Anomalies),该插入的数据插不进去

如果成立一个新的软件工程系,还没有招生,我们就无法把这个系及其系主任的信息存入数据库。

4、删除异常(Deletetion Anomalies),不该删除的数据也删除了

如果某个系的学生全部毕业了,我们在删除该系学生信息的同时,把这个系及其主任的信息也丢掉了。

?什么是一个好的模式 ?

➠好的设计模式不会发生插入异常、删除异常、更新异常、数据冗余应尽可能少

问题的原因:
由于模式中的某些数据依赖引起的。
数据依赖:
◆是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系
◆是现实世界属性间相互联系的抽象
是数据内在的性质
是语义的体现

数据依赖对关系模式的影响:
不合适的数据依赖,造成插入异常、删除异常、更新异常和数据冗余问题

用一张图表示函数依赖
在这里插入图片描述

解决方法:把这个单一模式分成3个关系模式
S( Sno, Sdept, Sno→Sdept);
SC ( Sno, Cno, Grade, (Sno, Cno)→Grade);
DEPT (Sdept, Mname, Sdept→Mname)
这三个模式不会发生插入异常、删除等异常;数据冗余得到控制。

如何解决关系模式中存在的问题:
规范化理论——找出关系模式中不合适的数据依赖,消除它们,可以在不同程度上解决插入异常、删除异常、更新异常和数据冗余问题。

函数依赖

在这里插入图片描述

在这里插入图片描述
如何确定函数依赖?
◆函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
●如Sname→Sno函数依赖只有在“学生不允许有重名”的条件下成立。

平凡函数依赖与非平凡函数依赖
●X→Y, Y⊈X, 则称X→Y是非平凡的函数依赖。
●X→Y, Y⊆X, 则称X→Y是平凡的函数依赖。

在这里插入图片描述

完全函数依赖与部分函数依赖

在这里插入图片描述
传递函数依赖
在这里插入图片描述

范式

◆范式是一种符合某一级别的关系模式集合

◆关系数据库中的关系必须满足一定的要求。
满足不同程度要求的为不同范式

●范式的种类:
第一范式(1NF)☞☞☞☞☞☞☞☞(关系模式R的所有属性都是不可分的基本数据项)
第二范式(2NF)☞☞☞☞☞☞☞☞(关系模式R⊆1NF,并且每一个非主属性都完全函数依赖于R的码,则R⊆2NF。
第三范式(3NF)☞☞☞☞☞☞☞☞(关系模式R⊆1NF,若R中不存在这样的码X、属性组Y及非属性Z(Y⊉Z),使得X→Y,Y→Z,Y↛X,成立,则称R<U,F>⊆3NF ◆若R⊆3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码
)
BC范式(BCNF,Boyce和Codd共同提出的范式)☞☞☞☞☞☞☞☞通常也认为BC范式是修正的第三范式,有时也称为扩展的第三范式,即在关系模式R<U,F>中,如果每一个决定因素都包含码,则R⊆BCNF。
◆BCNF关系模式所具有的性质:
①所有非主属对每一个码都是完全依赖函数。
②所有的主属性对每一个不包含它的码也是完全函数依赖。
③没有任何属性完全函数依赖于非码的任何一组属性。

第四范式(4NF)☞☞☞☞☞☞☞☞
第五范式(5NF☞☞☞☞☞☞☞☞
●各种范式之间存在联系(低级范式包含高级范式):
在这里插入图片描述

规范化小结

●一个关系模式只要是其分量都是不可分的数据项,它就是规范化的关系模式,但这只是最基本的规范化。
●规范化程度过低的关系模式不一定能够很好的描述现实世界,可能会存在插入异常、删除异常、修改异常、数据冗余等问题,解决方法就是对其进行规范化,转换成高级范式。
●一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化
●关系数据库的规范化理论是数据库逻辑设计的工具。

◆关系模式规范化的基本步骤:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库设计——关系数据理论(超详细) 的相关文章

  • 数据库查询的内部实现

    根据我的经验 我使用过很多查询 例如select order by wheremysql sql server oracle 等中的子句等 有那么一刻我想 1 内部是如何编写来实现上述查询的 2 他们使用哪种语言 3 那是编程语言吗 如果是
  • App Engine 日志中的 /_ah/queue/__deferred__

    我有一个使用 Google Cloud SQL 的 App Engine 应用程序 并且从我的应用程序的页面中我正在执行一些数据库操作 每当访问此页面时 它都无法执行所有数据库操作 当我进入控制台时 我看到的只是 ah queue defe
  • 按任意顺序对 SQL 行输出进行排序?

    因此 在我的数据库中 我存储乐器名称 以及各种其他属性 比方说id是主键 并且name是唯一的密钥 在 PHP 脚本中 我按仪器类别选择项目 如下所示 name mysql real escape string POST name row
  • 增加 SQL 命令的命令超时

    我有一个小问题 希望有人能给我一些建议 我正在运行一个 SQL 命令 但由于数据量很大 该命令似乎需要大约 2 分钟才能返回数据 但默认的连接时间是 30 秒 我如何增加这个时间 并将其应用到这个命令 public static DataT
  • 通过 SQL Developer 连接时出现 ora-12505 错误

    我正在尝试使用 SQL Developer 远程连接到 Oracle 12c 数据库 为了从另一台计算机进行远程连接 我在运行 Oracle 的计算机上在 Windows 7 防火墙中打开了一个端口 该部分有效 但现在由于此错误 ORA 1
  • 选择 PostgreSQL 中的临时表? [复制]

    这个问题在这里已经有答案了 如何在 PostgreSQL 中使用 select into 创建临时表 例如在 SQL 中Select into temp tab from source tab 您可以尝试使用创建表为 http www po
  • 选择另一个表连接的每行的最小值

    我有下表 Table1 Table2 CardNo ID Record Date ID Name Dept 1 101 8 00 11 7 2013 101 Danny Green 2 101 13 00 11 7 2013 102 Tan
  • 如何从单行创建多行 - 规范化表

    我对 SQL 很陌生 并试图弄清楚这一点 我有一个名为 BUDGET 的表 其中包含一年中每个月的 12 列 显示该月的预算余额 所以表格看起来像这样 Department Year Month1 Month2 Month12 ABCD 2
  • 在 SSIS 中插入新记录之前如何清空目标表?

    我使用 SSIS 生成和转换新数据 以便以后在新系统中使用 每次运行 SSIS 包时我都会遇到问题 它不断将新记录插入到我的目标表中 如何先清空目标表 OLE DB Destination 然后插入新生成的记录 目前此问题的解决方法是执行d
  • 带有mysql的实体框架,linux和windows之间的表大小写问题

    我们目前正在开发一个使用 Code First Entity Framework 和 Mysql 的产品 开发数据库托管在 Windows 环境中 而生产 mysql 则托管在 Linux 环境中 我遇到的问题是 mysql 中的表命名如下
  • 查找分区内最大的连续数字组

    我有以下按player id 和match date 排序的数据 我想找出连续运行次数最多的记录组 从2014 04 03到2014 04 12连续3次运行4次 player id match date runs 1 2014 04 01
  • 尝试使用 Redshift SQL 对累积不同实体进行计数

    我正在尝试获取某个时间序列中 Redshift 中不同对象的累积计数 最简单的事情就是使用COUNT DISTINCT myfield OVER ORDER BY timefield DESC ROWS UNBOUNDED PRECEDIN
  • Android 上的查询何时返回 Null?

    我似乎没有找到任何有关查询 插入或任何其他返回 null 的 SQL 方法的信息 但如果发生错误 它就会发生 我只是想知道游标为空是否意味着发生了错误 或者是否意味着没有选择任何行 例如 我不知道应该如何对待它 作为一个错误或可能不时发生的
  • BigQuery 中的 EXP() 返回浮点错误

    我有以下查询 SELECT EXP col FROM project dataset tablename Where col is FLOAT 但是 我收到此错误 Error Floating point error in function
  • 实体框架中的级联更新

    我有以下涉及 2 个类的场景 public class Parent Key public int Id get set Other properties here public virtual IList
  • 检索多行最后插入的 id

    当将数据插入具有自动递增 PK 的表时 我需要获取该密钥以在另一个语句中使用 正如许多问题所示 这可以在 PHP 中使用mysql insert id 但是 我一直将插入内容分组在一起 因此一次插入不止一行 我这样做是因为我猜测可能会存在一
  • 在SSIS中导入已合并单元格的Excel

    我的问题是在读取合并 组合列单元格的 Excel 文件时 例如 将下面的excel数据读取到数据库中 Excel 输入 ID NAME DEPT FNAME LNAME 1 Akil Tiwari IT 2 Vinod Rathore IT
  • 查找包含具有指定名称的列的所有表 - MS SQL Server

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 是否可以查询包含以下列的表名 LIKE myName 搜索表 SELECT c name AS ColumnName SCHE
  • 为什么sql表名中通常使用下划线而不是驼峰式大小写[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Hibernate Query在系统中运行缓慢,但直接运行时速度很快

    我遇到了与本周播客中类似的问题 我们有一个使用 Hibernate 和 Sql Server 2005 的 Java 应用程序 Hibernate 正在为我们生成一个查询 该查询需要近 20 分钟才能完成 如果我们使用 show sql 进

随机推荐

  • 【一】重温HTML

    引言 经典对答 面试官 你了解HTML吗 回答 啊 我是来面试前端的呀 我会Vue 面试官 写文思考 写这一系列文章的时候 自己思考了几个问题 HTML的文章太多了 为什么还要写 HTML的入门谁不会 还要学 HTML的文章基本都是水文 谁
  • ES6解构赋值

    前面的话 我们经常定义许多对象和数组 然后有组织地从中提取相关的信息片段 在ES6中添加了可以简化这种任务的新特性 解构 解构是一种打破数据结构 将其拆分为更小部分的过程 本文将详细介绍ES6解构赋值 引入 在ES5中 开发者们为了从对象和
  • Mysql中MVCC的使用及原理详解

    准备 测试环境 Mysql 5 7 20 log 数据库默认隔离级别 RR Repeatable Read 可重复读 MVCC主要适用于Mysql的RC RR隔离级别 创建一张存储引擎为testmvcc的表 sql为 CREATE TABL
  • error compiling template但编辑器内未报错,处理步骤。

    1 首先寻找自己所引入的组件当中 例如用到了某个方法 而自己没有把方法写上 2 寻找自己所引入的代码当中是否有重复的代码 可能是复制的时候多复制一行而导致的 3 寻找是否有空格所导致的error compiling template 报错
  • 到处是“坑”的strtok()—解读strtok()的隐含特性

    在用C C 实现字符串处理逻辑时 strtok函数的使用非常广泛 其主要作用是按照给定的字符集分隔字符串 并返回各子字符串 由于该函数的使用有诸多限制 如果使用不当就会造成很多 坑 因此本文首先介绍那些经常误踩的坑 然后通过分析源代码 解读
  • Android——第三方Facebook授权登录获取用户信息

    由于项目中需要使用Facebook进行一键登录 所以记录下步骤 其实小伙伴直接看官网也可以 介绍的蛮详细的 先看下效果图吧 遵循以下步骤将Facebook登录添加到您的应用 Facebook开发者网站 https developers fa
  • bin文件转成C语言数组之c代码

    反汇编的时候用的着 include
  • Js弹出showModalDialog窗口---返回值或数组

    function showMyModalDialog url width height showModalDialog url dialogWidth width px dialogHeight height px center yes s
  • ACwing :01背包问题

    朴素的 动规的 基本表示 f i j 表示只看前 i 个物品 总体积是 j 的情况下 总价值最大是多少 result max f n 0 V f i j 1 不选第 i 个物品 f i j f i 1 j 2 选第 i个物品 f i j f
  • ubuntu 如何使用 root 用户

    环境 virtual box 6 1 ubuntu 1604 LTS 64 问题 一般的ubuntu会创建一个管理员用户 在使用 su 指令从管理员切换到root用户后 设在 etc profile的环境变量丢失 如何才能保证环境变量不变呢
  • Android开发中怎么实现上传图片到服务器

    要实现在Android开发中上传图片到服务器 可以按照以下步骤进行 1 在Android项目中添加相应的权限 确保应用程序可以访问设备上的照片或相机 在 AndroidManifest xml 文件中添加以下权限
  • linux服务端下的c++ udp socket demo

    linux服务端 udp socket demo 如下 创建接受数据的socket int iSock socket PF INET SOCK DGRAM 0 printf socket ss d n iSock struct sockad
  • 三种基于CUDA的归约计算

    归约在并行计算中很常见 并且在实现上具有一定的套路 本文分别基于三种机制 Intrinsic 共享内存 atomic 实现三个版本的归约操作 完成一个warp 32 大小的整数数组的归约求和计算 Intrinsic版本 基于Intrinsi
  • 网站视频服务器架设,云服务器架设网站视频教程

    云服务器架设网站视频教程 内容精选 换一换 安装MySQL本文档以 CentOS 6 5 64bit 40GB 操作系统为例 对应MySQL版本为5 1 73 CentOS 7及以上版本将MySQL数据库软件从默认的程序列表中移除 需执行s
  • Keil常见错误警告

    1 warning 767 D conversion from pointer to smaller integer 解释 将指针转换为较小的整数 影响 可能造成的影响 容易引起数据截断 造成不必要的数据丢失 如果出现 bug 很难 调试
  • mybatis 的mapper接口注入到spring 容器的源码解析

    一 环境准备 1 创建一个maven 项目 其POM文件如下
  • pytorch笔记12--无监督的AutoEncoder(自编码)

    1 AutoEncoder 给特征属性降维 2 Data gt 压缩 提取Data的关键信息 减小网络的运算压力 gt data 具有代表性的特征 gt 解压 还原数据信息 gt Pred Data 3 使用Mnist数据集训练 将数据先压
  • CentOS7安装wps

    第一步 首先到wps官网 http linux wps cn 下载 wps for linux 选择合适自己的系统位数的rpm包 如下图所示 第二步 打开终端 cd进入文件下载的路径 我下载的存放路径是 home zjh Downloads
  • 大数据课程L4——网站流量项目的Hive离线批处理

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 掌握网站流量项目的 Hive 的占位符与文件的调用 掌握网站流量项目的 Hive 离线批处理过程 掌握网站流量项目的定时任务改造Hive离线处理过程 一 Hi
  • 数据库设计——关系数据理论(超详细)

    问题 什么是一个好的数据库逻辑设计 关系型数据库逻辑设计 针对一个具体问题应如何构造一个适合于它的数据模式 即应构造几个关系 每个关系由哪些属性组成等 eg 这样的设计是一个好的设计吗 观察这个表所对应的一个实例 在某个时刻student模