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

news2024/10/7 9:23:07

假设有一个关系 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的关系中,除了主键以外的任何属性都不依赖于其他非主属性,仅依赖于主键。

示例说明:
假设我们有一个学校数据库的初始设计,记录了学生、课程和教师的信息,设计了一个表来表示学生选课情况,但这个表不满足3NF

CREATE 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.coloradmin.cn/o/1885776.html

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

相关文章

如何定制化 ListView 界面

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…

PostgreSQL主从同步

目录 一、主从复制原理 二、配置主数据库 2.1 创建同步账号 2.2 配置同步账号访问控制 2.3 设置同步参数 3.4 重启主数据库 三、配置从数据库 3.1 停止从库 3.2 清空从库数据文件 3.3 拉取主库数据文件 3.4 配置从库同步参数 3.5 启动从库 四、测试主从 4.1在主库…

33 包装器

c11 也叫适配器。c中的function本质是一个类模板,也是一个包装器 为什么需要fuction呢? 当一个类型既可以是函数指针,也可以是仿函数和lambda比倒是,函数指针的类型不好理解,仿函数写起来麻烦,lambda无法拿…

前端基础:CSS(篇二)

目录 盒子 模型(box-model) 盒子 模型-内容区 代码 运行 盒子 模型-内边距 代码 运行 盒子 模型-边框 代码 运行 盒子 模型-外边距 代码 运行 清除浏览器的默认样式 代码 运行 盒子模型练习 代码 运行 ​编辑 文档流 浮…

IO模型与多路复用

前言 在Linux中有一句经典台词:“Linux一切皆文件”。IO操作是与文件进行交流的唯一方式,也就是说这是与Linux系统交流的唯一手段。就如同人与人之间的交流,如果我们连交流的方式都不甚了解,交流的效率就会变得低下。操作系统也是…

计算机专业的概念需要拓宽|终身学习之旅利:用FlowUs打造个性化学习记录知识库

计算机相关专业长期以来一直是热门选择,这主要得益于技术的快速发展和广泛的应用场景。随着AI技术的不断进步,这一趋势在未来几年内仍有望持续。以下是从不同角度对这个问题的分析: 从AI发展的角度: 技术革新:AI技术…

2024年地球生态学与绿色发展国际会议 (EEGD 2024)

2024年地球生态学与绿色发展国际会议 (EEGD 2024) International Conference on Earth Ecology and Green Development in 2024 【重要信息】 大会地点:济南 大会官网:http://www.iceegd.com 投稿邮箱:iceegdsub-conf.com 【注意&#xff1a…

新赛季守望先锋2延迟高怎么办?快速降低守望先锋2延迟的小妙招

随着守望先锋2新赛季的开启,这款游戏又引入了大量全新内容,包括新地图、新神话皮肤等。而之前在预告片最后出现的《变形金刚》系列标志性的变形音效,表明在本赛季将与《变形金刚》系列展开联动更是吸引了不少玩家的关注。因为7月9日变形金刚联…

安装Rabbitmq遇到的坑

!!!一定要对号版本号 不同的虚拟机unbontu、cetenos和不同的erlang和不同的rabbitmq之间要对应下载对应版本 下面给出我的版本centos7erlangrabbitmq 分割线 安装好后,如果在虚拟机的服务器上可以打开,在本地浏览器…

【基于R语言群体遗传学】-3-计算等位基因频率

书接上文,我们讲完了哈代温伯格基因型频率,也使用数据进行了拟合,那么接下来就是考虑一些计算的问题: 【基于R语言群体遗传学】-1-哈代温伯格基因型比例-CSDN博客 【基于R语言群体遗传学】-2-模拟基因型(simulating …

Hubstudio指纹浏览器:海外代理IP新选择,IPXProxy为何备受推崇?

许多人都会把Hubstudio指纹浏览器和代理IP进行搭配使用,为了保证网络操作的顺利进行,例如亚马逊的多账号管理。那有没有好用的海外代理IP呢,如何在Hubstudio指纹浏览器中使用代理IP呢? 下面就给大家推荐好用的一家海外IP代理&…

收银系统源码-千呼新零售2.0

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

SMARTFORMS

page(节点)-> wondows(容器)

AI网络爬虫004:从东方财富网批量获取上市公司的全部新闻资讯

文章目录 一、目标二、输入内容三、输出内容一、目标 用户输入一个上市公司名称,然后程序自动从东方财富网批量获取上市公司的全部新闻资讯 查看相关元素在源代码中的位置: 新闻标题:<a href="http://finance.eastmoney.com/a/202405233084538683.html" targ…

Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自动化(四)Jenkins配置

一、背景 Jenkins&#xff08;本地宿主机搭建&#xff09; 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码&#xff08;可不改&#xff0c;如果运行报allure找不到就直接注释掉&#xff09; …

以责任铸就品牌,以行动推动社会进步

成都树莓集团&#xff0c;作为数字产业生态链的积极建设者&#xff0c;始终将履行社会责任作为企业发展的核心要义。我们深知&#xff0c;企业的成功不仅仅在于经济效益的取得&#xff0c;更在于对社会的贡献与回馈。 一、履行社会责任的实践 1、倡导绿色、低碳、可持续的发展…

Redis 7.x 系列【13】数据类型之地理位置(Geospatial)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 GEOADD2.2 GEODIST2.3 GEORADIUS2.4 GEOPOS2.5 GEORADIUSBYMEM…

C++ 和C#的差别

首先把眼睛瞪大&#xff0c;然后憋住一口气&#xff0c;读下去&#xff1a; 1、CPP 就是C plus plus的缩写&#xff0c;中国大陆的程序员圈子中通常被读做"C加加"&#xff0c;而西方的程序员通常读做"C plus plus"&#xff0c;它是一种使用非常广泛的计算…

​RAG与LLM原理及实践(8)--- Chroma 应用场景及限制

前言 通过前面几节的介绍&#xff0c;你应该对Chroma的运作原理有相当透彻的理解。Chroma的设计正如之前描述的&#xff1a; Chroma提供的工具&#xff1a; 存储文档数据和它们的元数据&#xff1a;store embeddings and their metadata 嵌入&#xff1a;embed documents an…

仓库管理系统25--数据导出

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、添加用户控件 <UserControl x:Class"West.StoreMgr.View.DataExportView"xmlns"http://schemas.microsof…