数据库的三大设计范式和BCNF

news/2024/12/5 13:35:45/

数据库的三大设计范式

  1. 第一范式(1NF):确保数据表中的每个列都是原子的,即每个列都包含不可再分的数据项。这意味着在每个列中不能有重复的数据,也不能包含多个值。每个数据项应该是独立的,以便能够对其进行有效的排序、搜索和过滤。

  2. 第二范式(2NF):在满足第一范式的基础上,要求非主键列完全依赖于主键,而不是依赖于主键的一部分。简单来说,就是要保证非主键列与主键之间的关系是一对一的,而不是一对多的。这样可以消除数据冗余,减少更新异常。

  3. 第三范式(3NF):在满足第二范式的基础上,要求非主键列之间不存在传递依赖。也就是说,非主键列之间不能相互依赖,而是通过主键来进行关联。这样可以进一步消除数据冗余,减少更新异常,提高数据的一致性和完整性。

    遵循这三大设计范式可以帮助设计出结构良好、高效和易于维护的数据库模型。然而,有时根据具体情况,可能需要根据实际需求进行灵活的设计,甚至违反某些范式。

BCNF

BCNF(Boyce-Codd Normal Form,Boyce-Codd范式)是数据库设计中的一种更高级的范式,它在第三范式(3NF)的基础上进一步消除了函数依赖。

BCNF要求一个关系模式R满足以下两个条件:

  1. R必须满足第三范式(3NF)。
  2. 对于关系模式R中的每个非平凡函数依赖X → Y,X必须是R的超键。

其中,非平凡函数依赖指的是Y不包含X的情况,即Y不能完全依赖于X的真子集。超键是能够唯一标识关系模式中的每个元组的属性集合。

BCNF的目标是消除关系模式中的所有主属性之间的非平凡函数依赖,确保数据的完整性和一致性。遵循BCNF可以避免数据冗余和更新异常,提高数据库的性能和可维护性。

需要注意的是,BCNF并不是数据库设计中的最高范式。在某些情况下,可能需要进一步优化设计,例如使用第四范式(4NF)或其他扩展范式。

举例说明

满足三大设计范式的示例:

假设我们有一个名为"订单"(Orders)的数据库表,记录了客户的订单信息。表中包含以下列:订单号(OrderID),客户ID(CustomerID),客户姓名(CustomerName),产品ID(ProductID),产品名称(ProductName),订单日期(OrderDate),订单数量(Quantity),订单总价(TotalPrice)。

OrderIDCustomerIDCustomerNameProductIDProductNameOrderDateQuantityTotalPrice
1101Alice201Widget A2023-05-01220.00
2102Bob202Widget B2023-05-02330.00
3101Alice203Widget C2023-05-03115.00

在这个示例中,每列都是原子的,没有重复的数据或多个值,满足第一范式;
非主键列完全依赖于主键(OrderID),而不是依赖于主键的一部分,满足第二范式;
非主键列之间不存在传递依赖,满足第三范式。

不满足三大设计范式的示例:

假设我们有一个名为"学生课程"(Student_Course)的数据库表,记录了学生选修的课程信息。表中包含以下列:学生ID(StudentID),学生姓名(StudentName),课程列表(Courses)。

StudentIDStudentNameCourses
1AliceMath, Science
2BobMath, History
3CharlieScience, Geography

在这个示例中,虽然每列都是原子的,满足第一范式,但是课程列表(Courses)这一列包含多个值,违反了第一范式的要求。此外,该设计也违反了第二范式和第三范式,因为非主键列(课程列表)对于主键(学生ID)是部分依赖的,并且存在传递依赖(例如,课程之间的关系依赖于学生ID)。因此,该设计不满足三大设计范式。

满足BCNF的示例:

假设我们有一个名为"图书作者"(Book_Author)的数据库表,记录了图书和作者的关系。表中包含以下列:图书ID(BookID),图书名称(BookName),作者ID(AuthorID),作者名称(AuthorName)。

BookIDBookNameAuthorIDAuthorName
1Book A101Author X
2Book B102Author Y
3Book C101Author X
4Book D103Author Z

在这个示例中,每列都是原子的,没有重复的数据或多个值,满足第一范式;非主键列完全依赖于主键(BookID),而不是依赖于主键的一部分,满足第二范式;并且不存在非主键之间的传递依赖,满足第三范式。此外,对于任何非平凡的函数依赖(例如,BookID → AuthorName),左侧都是超键,因此满足BCNF。

不满足BCNF的示例:

假设我们有一个名为"学生课程成绩"(Student_Course_Grade)的数据库表,记录了学生选修的课程以及他们的成绩信息。表中包含以下列:学生ID(StudentID),学生姓名(StudentName),课程ID(CourseID),课程名称(CourseName),成绩(Grade)。

StudentIDStudentNameCourseIDCourseNameGrade
1Alice101MathA
1Alice102ScienceB
2Bob101MathB+
2Bob103HistoryA-
3Charlie102ScienceA

在这个示例中,每列都是原子的,没有重复的数据或多个值,满足第一范式;非主键列完全依赖于主键(StudentID, CourseID),而不是依赖于主键的一部分,满足第二范式;非主键列之间不存在传递依赖,满足第三范式。

然而,这个设计不满足BCNF,因为存在非平凡的函数依赖。例如,对于(StudentID, CourseID)为主键,我们可以推断出(StudentID, CourseName)作为一个非平凡的函数依赖。这意味着非主键列(CourseName)依赖于主键的一部分(StudentID),而不是完全依赖于整个主键。因此,这个设计违反了BCNF。要满足BCNF,可以将表分解为两个关系,一个包含(StudentID, CourseID, Grade),另一个包含(CourseID, CourseName)来消除依赖关系。


http://www.ppmy.cn/news/107587.html

相关文章

线程的取消和互斥

线程的互斥和同步 临界资源概念: 不能同时访问的资源,比如写文件,只能由一个线程写,同时写会写乱。 比如外设打印机,打印的时候只能由一个程序使用。 外设基本上都是不能共享的资源。 生活中比如卫生间&#xff0…

LeeCode——回溯法、动态规划、贪心法、分治法(快速说明)

1、四种方法的对比 算法方法用处优点缺点拓展与改良回溯法适用于求解组合问题、排列问题、搜索问题等。 1. 可以搜索整个解空间,找到最优解。 2. 不需要预先知道问题的解可能在哪里。 1. 时间复杂度高,因为需要遍历整个解空间。 2. 需要较大的空间存储…

Linux安装Redis数据库,实现远程连接

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 转发自cpolar内网穿透的文章:公网远程连接…

AHB-to-APB Bridge——06testbench、env、base_test、scb

框架: testbench: HCLK_PCLK_RATIO:随机定义hclk pclk比率;各个接口clk、rst连接;生成满足相应比率的pclk;与DUT的连接;将vif set到agt中去;agt在set到底层 关于rest_if&#xff…

【满分】【华为OD机试真题2023B卷 JAVAJS】数字游戏

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 数字游戏 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 小明玩一个游戏。系统发1+n张牌,每张牌上有一个整数。第一张给小明,后n张按照发牌顺序排成连续的一行。需要小明判断,后n张牌中,是否存在连续的若干张…

QT的标准对话框使用

QT 中提供的标准对话框: QColorDialog QFileDialog QFontDialog QInputDialog QMessageBox QProgressDialog 1 颜色选择对话框使用: void ShowColorSelectDialog(){QTextStream out(stdout);//颜色对话框:QColor color QColorDialog::getColor(Qt::blue,this,&qu…

生产环境之负载均衡LVS+keepalived方案(2)_LVS介绍

LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,linux内核2.6.X之后的版本默认已集成了LVS模块(内核模块名为:ipvs),实现了基于传输层的请求负载均衡调度方案,LVS支持的工作模…

Data Feed数据源

本文档参考backtrader官方文档,是官方文档的完整中文翻译,可作为backtrader中文教程、backtrader中文参考手册、backtrader中文开发手册、backtrader入门资料使用。 Data Feed数据源章节目录 数据源(data feed)数据源概述数据源通用参数CSV数据源通用参数GenericCSVData数据源…