数据库范式拆分实战

函数依赖

如果给定一个X,能唯一确定一个Y,就称X确定Y,或者说Y依赖于X,例如Y = X*X函数。

X -> Y(X确定Y,Y依赖于X)

部分函数依赖

A可确定C,(A,B)也可确定C,(A,B)中的一部分(即A)可以确定C,称为部分函数依赖

A -> C
AB -> C

image

传递函数依赖

当A和B不等价时,A可确定B,B可确定C,则A可确定C,是传递函数依赖;若A和B等价则不存在传递,直接就可确定C。

A -> B
B -> C
=> A -> C

image

  • 候选键:唯一标识表的属性或者属性组合。(候选键可以有多个)
    • 学生(学号,姓名,年龄,身份证号) 学号和身份证号都可以唯一标识,所以有两个候选键,一个是学号,一个是身份证号。
  • 主键:任选一个候选键,即可作为主键。
    • 既可以选择学号为主键或者可以选择身份证号为主键。
  • 外键:其他表中的主键。
  • 主属性:候选键内的属性为主属性,其他属性为非主属性。

公理系统

设关系模式R<U,F>,U是关系模式R的属性全集,F是关系模式R的一个函数依赖集。对于R<U,F>来说有以下的:

  • 自反律:若Y⊆X⊆U,则X->Y为F所逻辑蕴含
  • 增广律:若X->Y为F所逻辑蕴含,且Z⊆U,则XZ -> YZ为F所逻辑蕴含
  • 传递律:若X -> Y和Y -> Z为F所逻辑蕴含,则X -> Z为F所逻辑蕴含
  • 合并规则:若X -> Y,X -> Z,则X -> YZ为F所蕴含
  • 伪传递率:若X -> Y,WY -> Z,则XW -> Z为F所蕴含
  • 分解规则:若X -> Y,Z⊆Y,则 X -> Z为F所蕴含

范式

第一范式

第一范式1NF:关系中的每一个分量必须是一个不可分的数据项。

举例:一张学生表(基本关系)如下:

学号学生姓名所在系系主任名称课程号成绩
201102张明计算机系张三0470
201103王红计算机系张三0560
201103王红计算机系张三0480
201103王红计算机系张三0687
201104李青机械系王五0979

学生表中的属性(字段),都是一个不可分的数据项,所以上述学生表是第一范式。

第一范式存在很多问题,比如大量的冗余,关系不明确等,所以需要改造到第二范式

第二范式

第二范式2NF:如果关系R属于1NF,且每一个非主属性完全函数依赖于任何一个候选码,则R属于2NF。通俗的说,2NF就是在1NF的基础上,表中的每一个非主属性不会依赖复合主键中的某一个列

第二范式的本质是消除了部分函数依赖。

  • 候选键:主属性
  • 非候选键:非主属性

分析依赖关系:

  • 学号 -> 学生姓名
  • 学号 -> 系名
  • 系名 -> 系主任名称
  • (学号,课程号)-> 成绩

候选键:学号+课程号(联合候选键,本质是一个候选键,不是多个候选键)

函数依赖:候选键的一部分可以决定非主属性,称为函数依赖。

从上述依赖关系和函数依赖的定义可以推出表中的函数依赖为:

  • 学号 -> 学生姓名
  • 学号 -> 系名

总结:如果候选键为单属性,那么必然不存在部分函数依赖。

通过拆表,消除部分函数依赖,以满足2NF,可以将学生表拆为以下两张表:

  • 学生表(学号,学生姓名,系名,系主任)
    • 2NF
    • 学号 -> 学生姓名
    • 学号 -> 系名 -> 系主任
  • 选课表(学号,课程号,成绩)
    • 2NF
    • 学号 + 课程号 -> 成绩

学生表

学号学生姓名系名系主任
201102张明计算机系张三
201103王红计算机系张三
201104李青机械系王五

选课表

学号课程号成绩
2011020470
2011030560
2011030480
2011030687
2011040979

经过拆表,学生表从1NF拆分为两个满足2NF的表。

第三范式

第三范式3NF:在满足2NF的基础上,表中不存在非主属性对候选键的传递依赖

第二范式的本质是消除了传递函数依赖。

  • 学生表(学号,学生姓名,系名,系主任)
    • 2NF
    • 学号 -> 学生姓名
    • 学号 -> 系名 -> 系主任(传递函数依赖,不满足3NF)
  • 选课表(学号,课程号,成绩)
    • 2NF
    • 学号 + 课程号 -> 成绩

继续拆表,消除传递函数依赖,以满足3NF:

  • 学生表(学号,学生姓名,系名,系主任)
    • 3NF
    • 学号 -> 学生姓名
    • 学号 -> 系名
  • 系表
    • 3NF
    • 系名 -> 系主任
  • 选课表(学号,课程号,成绩)
    • 3NF
    • 学号 + 课程号 -> 成绩

学生表

学号学生姓名系名
201102张明计算机系
201103王红计算机系
201104李青机械系

系表

系名系主任
计算机系张三
机械系王五

选课表

学号课程号成绩
2011020470
2011030560
2011030480
2011030687
2011040979

优化

名称字段不适合作为主键,系表可以通过设计系编号来解决。

学生表

学号学生姓名系编号
201102张明computer
201103王红machine
201104李青machine

PK:学号
FK:系编号

系表

系编号系名系主任
computer计算机系张三
machine机械系王五

PK:系编号

选课表

学号课程号成绩
2011020470
2011030560
2011030480
2011030687
2011040979

PK:学号+课程号

经过以上拆分设计,所有的表都满足3NF,且没有冗余属性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[金三银四] 操作系统上下文切换系列

图源&#xff1a; https://zhuanlan.zhihu.com/p/540717796 文章目录 2.11 cpu 的上下文切换2.12 协程的上下文切换2.13 线程的上下文切换2.14 进程的上下文切换2.15 中断上下文切换2.16 什么时候会发生进程的上下文切换2.17 什么时候会发生线程的上下文切换2.18 什么时候会发生…

程序汪保姆教程在linux上部署运行一套SpringBoot内容管理系统

❝ 程序汪已经分享了很多开源项目了&#xff0c;发现一个痛点很多人拿到开源项目了不会部署运行&#xff0c;光看代码很多人看不下去的&#xff08;程序汪也是这样&#xff09;&#xff0c;程序汪建议拿到开源项目了&#xff0c;一定要想办法把项目运行起来跑跑&#xff0c;然后…

树的遍历方式DFS和BFS

DFS(depth first search) 深度优先遍历 从图中一个未访问的顶点V开始&#xff0c;沿着一条路一直走到底&#xff0c;然后从这条路尽头的节点回退到上一个节点&#xff0c;再从另一条路走到底…不断递归重复这个过程&#xff0c;直到所有的顶点都遍历完成。前序遍历&#xff0c…

【Postman】工具使用介绍

一、postman工具介绍 1.什么是postman postman是谷歌开发的一款网页调试和接口测试工具&#xff0c;能够发送任何请求类型的http请求&#xff0c;支持GET/POST/PUT/DELETE等方法。postman简单易用&#xff0c;可以直接填写URL&#xff0c;header&#xff0c;body就可以发送一…

OpenHarmony开发自测试执行框架

OpenHarmony为开发者提供了一套全面的开发自测试框架OHA-developer_test&#xff0c;开发者可根据测试需求开发相关测试用例&#xff0c;开发阶段提前发现缺陷&#xff0c;大幅提高代码质量。 本文从基础环境构建&#xff0c;用例开发&#xff0c;编译以及执行等方面介绍OpenH…

双向链表

目录 单向链表 双向链表 特点 缺点 双向链表的封装 单向链表 只能从头遍历到尾或者从尾遍历到头(一般从头到尾)。也就是链表相连的过程是单向的. 实现的原理是上一个链表中有一个指向下一个的引用 单向链表有一个比较明显的缺点: 我们可以轻松的到达下一个节点,但是回到…

Docker 入门使用说明

Docker 入门使用说明 Docker 安装 Docker 官网&#xff1a;Docker Docker 安装说明&#xff1a;Docker 安装说明 这里由于 Docker 在实时更新&#xff0c;所以每次安装 Docker 用来导入 key 的链接可能会有变化&#xff0c;这里就参考官方的安装方法即可 Docker 常用命令说…

OSCP靶场--Clue

OSCP靶场–Clue 考点(文件读取读取配置中的密码rce认证后利用sudo 提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.163.240 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-14 08:44 EDT Nmap scan report for 192…

网络通信VLAN学习篇

拓扑图 如上图&#xff0c;pc3&#xff0c;pc5同一网络&#xff0c;pc4&#xff0c;pc6同一网络&#xff0c;vlan的划分就是虚拟局域网&#xff0c;局域网的理解就是同一vlan下的设备可以相互通信&#xff0c;不同vlan不可以通信&#xff08;通过三层交换机可以实现通信的&…

缓存穿透、缓存击穿、缓存雪崩及其解决方法

缓存穿透、缓存击穿、缓存雪崩是redis的三大问题。 在介绍这三大问题之前&#xff0c;我们需要先了解Redis作为一个缓存中间件&#xff0c;在项目中是如何工作的。首先看一下在没有缓存中间件的时候的系统数据访问的架构图&#xff1a; 客户端发起一个查询请求的时候&#xff…

面试算法-98-随机链表的复制

题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节…

深入理解 Docker 镜像

1. Docker 镜像的底层原理 1.1 分层的镜像 以我们的pull 命令为例&#xff0c;在下载的过程中我们可以看到docker的镜像好像是一层一层的在下载。 1.2 UnionFS(联合文件系统) 联合文件系统是一种分层、轻量级并且高性能的文件系统&#xff0c;它支持对文件系统的修改作为一次…

马斯克AI大模型Grok开源了!

2024年3月18日&#xff0c;马斯克的AI创企xAI兑现承诺&#xff0c;正式发布了此前备受期待大模型Grok-1。 代码和模型权重已上线GitHub: https://github.com/xai-org/grok-1 截止目前&#xff0c;Grok已经在GitHub上获得了35.2k颗Star&#xff0c;还在不断上升中。 Grok官方博…

202446读书笔记|《夜风颂》——生命的内核是过往和希望 有情在朝暮 长聚长相思

202446读书笔记|《夜风颂》——生命的内核是过往和希望 有情在朝暮 长聚长相思 序现代诗古体诗 《夜风颂》作者王锴&#xff0c;前段时间加入书架的书&#xff0c;前边有几首现代诗挺惊艳&#xff0c;蛮喜欢的&#xff0c;后边古体诗稍逊色些。值得一读的一本小诗集。 序 海鸥之…

蓝桥杯(2):python基础算法【上】

时间复杂度、枚举、模拟、递归、进制转换、前缀和、差分、离散化 1 时间复杂度 重要是看循环&#xff0c;一共运行了几次 1.1 简单代码看循环 #时间复杂度1 n int(input()) for i in range(1,n1):for j in range(0,i):pass ###时间复杂度&#xff1a;123....nn(1n)/2 所以…

Ambari——编译——解决替换yarn 版本后 系mvn 打包找不到yarn 文件问题

您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 报错原因&#xff1a; [ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.4:yarn (yarn install) on project amb…

python综合实战案例-数据分析

Python是进行数据分析的好工具&#xff0c;今天就是借助一个案例给大家进行数据分析讲解。 本例设计一个log.txt⽂件&#xff0c;该文件记录了某个项⽬中某个 api 的调⽤情况&#xff0c;采样时间为每分钟⼀次&#xff0c;包括调⽤次数、响应时间等信息&#xff0c;⼤约18万条数…

基于Java中的SSM框架实现快餐店线上点餐系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现快餐店线上点餐系统演示 摘要 随着计算机互联网的高速发展。餐饮业的发展也加入了电子商务团队。各种网上点餐系统纷纷涌现&#xff0c;不仅增加了商户的销售量和营业额&#xff0c;而且为买家提供了极大的方便&#xff0c;足不出户&#xff0c;就能订…

备战蓝桥杯---牛客寒假算法基础集训6

1.并查集数学 分析&#xff1a; 首先我们知道算数基本定理&#xff0c;如果两个数有大于1的质因子&#xff0c;那么我们就需要把他们放在同一个集合&#xff0c;因此我们可以用欧拉刷出1e6范围内的素数&#xff0c;然后依次看输入的数。 拿202*2*5举例子&#xff0c;我们在求…

检索增强生成(RAG)技术:实现流程、作用及应用案例

一. RAG简介 在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术巧妙地结合了信息检索与神经网络生成模型的力量&#xff0c;通过在生成过程中引入相关的外部信息&#xff0c;实现了在…
最新文章