软考 有向图 数据库之关系模式范式

假设有一个关系 R(A, B, C, D),并且已知以下函数依赖: A → B B → C BC → D 求候选键?   求候选码?  候选键/候选码 是同一个概念.

 数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。


https://cloud.tencent.com/developer/article/2055118


2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖
 

3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖

一般在我们设计关系型数据库的时候,最多考虑到BCNF就够

https://www.cnblogs.com/xinaixia/p/4384353.html

第一范式(1NF)是关系数据库设计中的基本规范之一,确保数据库表的结构是原子的,不包含重复的组或集合。具体来说,1NF 要求:

  1. 每个表格单元格必须是原子性的:这意味着每个表格中的每个字段只能包含单一的值,而不能是多个值的集合。如果一个字段包含多个值,需要将其拆分成多个单独的字段。

举例来说,假设我们有一个存储学生信息的表格,如果表格设计如下:

学生ID姓名电话号码
1小明1234567890, 9876543210

在这个例子中,电话号码这一字段包含了两个值,使用逗号分隔。这不符合第一范式的要求,因为电话号码应该是一个原子的数据单元。要符合第一范式,应该将这个表格重构如下:

学生ID姓名电话号码1电话号码2
1小明12345678909876543210

在重构后的表格中,每个电话号码现在都位于自己的字段中,每个字段只包含一个值,符合第一范式的要求。

总结来说,第一范式强调每个字段必须是原子性的,不可再分,不包含集合或者多个值,以确保数据库表的结构清晰、规范化,便于数据的管理和查询

第二范式(Second Normal Form, 2NF)是对第一范式(1NF)的一个扩展,要求关系模式除了满足1NF(即表中的每个字段都是不可分割的基本数据项)之外,还要满足非主属性对码不存在部分函数依赖。简单来说,就是确保表中的每一个非主属性都完全依赖于整个主键,而不是主键的一部分示例说明:
假设我们有一个订单管理系统的简单订单表,最初设计如下,不满足2NF:CREATE TABLE Orders (OrderID INT PRIMARY KEY,CustomerName VARCHAR(100),CustomerAddress VARCHAR(200),ProductID INT,Quantity INT,Price DECIMAL(10, 2)
);在这个表中,OrderID 是主键,用于唯一标识每个订单。但是,存在部分函数依赖,因为CustomerName和CustomerAddress只依赖于OrderID的一部分潜在含义——即客户信息,而实际上每个订单可能属于同一个客户,这样就导致了数据冗余。如果一个客户有多份订单,那么这个客户的姓名和地址就会在表中重复存储多次。
调整至2NF:
为了满足2NF,我们需要消除这种部分函数依赖,将表拆分为两个,确保每个非主属性都完全依赖于主键。
订单表(Orders):
CREATE TABLE Orders (OrderID INT PRIMARY KEY,CustomerID INT,ProductID INT,Quantity INT,Price DECIMAL(10, 2),FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);客户表(Customers):
CREATE TABLE Customers (CustomerID INT PRIMARY KEY,CustomerName VARCHAR(100),CustomerAddress VARCHAR(200)
);
现在,Orders 表中的CustomerID引用了Customers表的主键,这样就消除了部分函数依赖。每个客户的信息只存储一次,无论他们有多少个订单,这不仅减少了数据冗余,也提高了数据的一致性和更新效率。这就是一个典型的将关系模式从1NF转换到2NF的例子。第三范式(Third Normal Form, 3NF)是在第二范式(2NF)的基础上进一步消除非主属性对码的传递函数依赖。也就是说,在一个满足3NF的关系中,除了主键以外的任何属性都不依赖于其他非主属性,仅依赖于主键。示例说明:
假设我们有一个学校数据库的初始设计,记录了学生、课程和教师的信息,设计了一个表来表示学生选课情况,但这个表不满足3NFCREATE TABLE Student_Course_Teacher (StudentID INT,CourseID INT,TeacherID INT,CourseName VARCHAR(100),TeacherName VARCHAR(100),PRIMARY KEY (StudentID, CourseID)
);在这个表中,主键是由StudentID和CourseID组成的复合键,用来唯一标识学生选修的每门课程。但是,存在传递函数依赖:TeacherName依赖于TeacherID,
而TeacherID又通过CourseID间接依赖于主键(因为每个课程只有一位授课教师)。此外,CourseName依赖于CourseID,同样构成了传递函数依赖。
调整至3NF:
为了满足3NF,我们需要消除这些传递函数依赖,将表拆分成更小的、更专注的表,确保每个非主属性直接依赖于主键,而不是通过其他非主属性间接依赖。
学生选课表(Student_Course):
CREATE TABLE Student_Course (StudentID INT,CourseID INT,PRIMARY KEY (StudentID, CourseID),FOREIGN KEY (StudentID) REFERENCES Students(StudentID),FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);课程表(Courses):
CREATE TABLE Courses (CourseID INT PRIMARY KEY,CourseName VARCHAR(100),TeacherID INT,FOREIGN KEY (TeacherID) REFERENCES Teachers(TeacherID)
);教师表(Teachers):
CREATE TABLE Teachers (TeacherID INT PRIMARY KEY,TeacherName VARCHAR(100)
);

BCNF(Boyce-Codd Normal Form)是数据库规范化理论中的一种更高级别的范式,它是对第三范式(3NF)的进一步要求。BCNF 要求除了满足第三范式的所有条件外,还要求每一个确定关系的属性都与其所有候选关键字有关。简单来说,如果一个关系表中的所有非平凡函数依赖都是在候选关键字上的,则该关系表满足BCNF。

让我们通过一个例子来说明 BCNF 的概念和应用:

假设我们有一个关系表格存储员工的信息,其中包括员工号(EmployeeID)、姓名(Name)、部门号(DepartmentID)、部门名称(DepartmentName)等属性。

EmployeeIDNameDepartmentIDDepartmentName
1Alice101HR
2Bob102Finance
3Charlie101HR

在这个表格中,候选关键字可能是 {EmployeeID} 或 {EmployeeID, DepartmentID},因为 EmployeeID 是唯一标识一个员工,而 {EmployeeID, DepartmentID} 可能唯一标识一个部门内的员工。

现在,让我们检查该表是否符合 BCNF:

  1. 属性函数依赖分析

    • 假设我们有以下函数依赖:
      • EmployeeID → Name (每个 EmployeeID 对应唯一的 Name)
      • DepartmentID → DepartmentName (每个 DepartmentID 对应唯一的 DepartmentName)
      • EmployeeID, DepartmentID → DepartmentName (每个员工在一个部门中有一个特定的部门名称)
  2. 确定关系

    • 候选关键字可以是 {EmployeeID} 或 {EmployeeID, DepartmentID}。
  3. 检查是否满足 BCNF

    • 现在我们来看,每个非平凡函数依赖是否都是在候选关键字上的。
    • 对于函数依赖 EmployeeID, DepartmentID → DepartmentName,我们可以看到 EmployeeID 和 DepartmentID 一起确定了 DepartmentName,因此这个函数依赖满足 BCNF 的要求。

因此,这个表格满足 BCNF 的要求,因为所有非平凡函数依赖都是在候选关键字上的。这保证了表格结构的规范化,避免了数据冗余和插入异常,并且确保了数据的一致性和完整性。

自己的软考软件设计师笔记总结_后端_佳捷-开放原子开发者工作坊

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

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

相关文章

visual studio 2022配置和使用protobuf

上图证明,我真的测了好多遍,测了好多版本的protobuf,花了很多时间。不过好在最后在vs2022上测通了。 下载protobuf 这里是protobuf下载的地址。 Releases protocolbuffers/protobuf GitHub 个人使用的3.21.9这个版本才跑通的。 1、首先…

第6章_libmodbus使用

文章目录 第6章 libmodbus使用6.1 libmodbus开发库6.1.1 功能概要6.1.2 源码获取6.1.3 源码阅读1. 新建工程2. 同步文件3.打开工程4. 操作示例5. 快捷键 6.1.4 libmodbus与应用程序的关系 6.2 libmodbus源代码解析6.2.1 核心函数6.2.2 框架分析与数据结构6.2.3 情景分析1. 初始…

OOXML入门学习

进入-飞入 <par> <!-- 这是一个并行动画序列的开始。"par"代表并行&#xff0c;意味着在这个标签内的所有动画将同时开始。 --><cTn id"5" presetID"2" presetClass"entr" presetSubtype"4" fill"hold&…

C语言指针速成下篇

c语言的指针下篇终于迎来了收尾&#xff0c;那么废话不多说&#xff0c;我们直接进入正题 指针访问数组 # include <stdio.h> int main () { int arr[ 10 ] { 0 }; // 输⼊ int i 0 ; int sz sizeof (arr)/ sizeof (arr[ 0 ]); // 输⼊ int * p arr //这…

在Tomcat中部署war包

1、准备war包 确保已经有一个有效的war包&#xff0c;该war包包含了web应用程序的所有内容&#xff1b; 2、停止tomcat服务器 在部署之前&#xff0c;确保tomcat服务器已经停止&#xff0c;进入tomcat的配置目录执行命令&#xff1a;[路径]/tomcat/conf&#xff1b; 在Linux…

Socket——向FTP服务器发送消息并获得响应

1、简介 Socket&#xff08;套接字&#xff09;是网络编程中用于描述IP地址和端口的一个抽象概念&#xff0c;通过它可以实现不同主机间的通信。套接字可以分为几种不同的类型&#xff0c;每种类型对应不同的协议和传输模式。 1.1、基本概念 IP地址&#xff1a;用于标识网络…

【管理咨询宝藏137】RB大型卡车集团供应链体系优化设计方案中期汇报

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏137】RB大型卡车集团供应链体系优化设计方案中期汇报 【格式】PDF版本 【关键词】罗兰贝格、供应链管理、运营提升 【核心观点】 - 甲方采取销售…

CBSD创建和管理bhyve容器Ubuntu@FreeBSD

bhyve介绍&#xff1a;bhyve&#xff1a;FreeBSD下的原生虚拟机管理器_freebsd 虚拟化平台bhyve-CSDN博客 两个bhyve的管理软件&#xff1a;使用bvm管理bhyve虚拟机管理系统FreeBSD-CSDN博客 vm-bhyve&#xff1a;bhyve虚拟机的管理系统FreeBSD-CSDN博客 现在&#xff0c;我…

从零开始做题:LSB

1 题目 2 解题 2.1 使用stegsolve工具 ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc] └─$ java -jar Stegsolve.jar 2.1.1 发现R、G、B的plane0有隐藏信息 2.1.2 提取隐藏信息 2.1.3 save bin后得到二维码 2.1.4 QR Research得到flag 3 flag cumtctf{1sb_i4_s0_Ea4y}

9种慢慢被淘汰的编程语言...【送源码】

技术不断进步&#xff0c;我们使用的编程语言也不例外。 随着人工智能的兴起以及对编程语言使用的影响&#xff0c;我们更加关注哪些语言将在未来继续流行&#xff0c;哪些会被淘汰。 Python、Java 和 JavaScript 等多功能编程语言正在主导市场&#xff0c;而其他一些语言则逐…

kubernetes给指定用户分配调用k8s的api权限

文章目录 概要利用RBAC添加角色权限使用shell命令创建角色权限使用配置文件创建角色权限 调用k8s的api获取k8s账户的token 小结 概要 使用kubernetes部署项目时&#xff0c;有些特殊场景&#xff0c;我们需要在自己创建的pod里面调用k8s的api来管理k8s&#xff0c;但是需要使用…

某山词霸翻译js逆向分析

一、基础知识 1、post的几种发包的方式 2、query string和form data的区别 Query String Parameters&#xff1a; GET请求时&#xff0c;参数会以url string 的形式进行传递&#xff0c;即?后的字符串则为其请求参数&#xff0c;并以&作为分隔符。&#xff08;有时候pos…

修改 app id - 鸿蒙 HarmonyOS Next

修改项目 app id 后通过真机 build run 的时候抛出了如下异常; 项目中更改后的配置与真机的不匹配; {app: {bundleName: "com.xxxxxx.xxx_harmony",vendor: "xxxxxx",versionCode: 1,versionName: "3.5.00",icon: "$media:app_icon",…

有什么简单易上手的CRM系统推荐?五款CRM软件评测

在数字化时代&#xff0c;企业急需一个能全面展示客户、销售和分析数据的CRM系统。当然&#xff0c;简单易用的CRM系统成了企业首选。选择系统时&#xff0c;同时要关注它的实际功能是否满足需求&#xff0c;是否容易上手&#xff0c;能否根据企业需求灵活定制&#xff0c;能否…

一种自定义SPI通信协议

本文介绍一种自定义SPI通信协议。 项目开发过程中&#xff0c;有时候会涉及到主处理器或FPGA和MCU之间的SPI通信&#xff0c;涉及到通信就需要考虑通信协议&#xff0c;本文给出一种简单的通信协议。 1.协议格式 协议格式如下图。 其中&#xff0c;将40 bit划分为2大部分&am…

springboot加载注入bean的方式

在SpringBoot的大环境下&#xff0c;基本上很少使用之前的xml配置Bean&#xff0c;主要是因为这种方式不好维护而且也不够方便。 springboto注入bean主要采用下图几种方式&#xff0c;分为本地服务工程注解声明的bean和外部依赖包中的bean。 一、 springboot装配本地服务工程…

Maven deploy上传远程私服失败

Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project 你的项目: Cannot deploy artifacts when Maven is in offline mode 解决方案&#xff1a; 1.IDEA把这个钩子去掉 2. settings.xml里把 <offline>标…

云计算【第一阶段(23)】Linux系统安全及应用

一、账号安全控制 1.1、账号安全基本措施 1.1.1、系统账号清理 将非登录用户的shell设为/sbin/nologin锁定长期不使用的账号删除无用的账号 1.1.1.1、实验1 用于匹配以/sbin/nologin结尾的字符串&#xff0c;$ 表示行的末尾。 &#xff08;一般是程序用户改为nologin&…

鸿蒙登录页面及页面跳转的设计

目录 任务目标任务分析任务实施1.新建工程项目HMLogin2.设计登录页面Index.visual3.设计第二个页面SecondPage4.修改Index.ets代码5.修改SecondPage.ets代码6.运行工程 任务目标 设计一个简单的登录页面&#xff0c;要求可以将第一页的登录信息&#xff0c;传递到第二个页面&a…

Cesium 在加载 3dTiles 如何如何获取ID

文章目录 问题分析问题 加载的 3dTiles 打印content.getFeature(i)出来后如图所示,想获取到id值 分析 var tileset = mapLayer.init3dTileLayer({url:it.url,maximumMemoryUsage: it.maximumMemoryUsage,