数据库范式拆分实战

news2024/9/28 11:23:27

函数依赖

如果给定一个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.coloradmin.cn/o/1541540.html

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

相关文章

基于深度学习的生活垃圾智能分类系统(微信小程序+YOLOv5+训练数据集+开题报告+中期检查+论文)

摘要 本文基于Python技术&#xff0c;搭建了YOLOv5s深度学习模型&#xff0c;并基于该模型研发了微信小程序的垃圾分类应用系统。本项目的主要工作如下&#xff1a; &#xff08;1&#xff09;调研了移动端垃圾分类应用软件动态&#xff0c;并分析其优劣势&#xff1b;…

stm32使用定时器实现PWM与呼吸灯

PWM介绍 STM32F103C8T6 PWM 资源&#xff1a; 高级定时器&#xff08; TIM1 &#xff09;&#xff1a; 7 路 通用定时器&#xff08; TIM2~TIM4 &#xff09;&#xff1a;各 4 路 例如定时器2 PWM 输出模式&#xff1a; PWM 模式 1 &#xff1a;在 向上计数 时&#xff0…

Linux之git

一、什么叫做版本控制 版本控制&#xff08;Revision control&#xff09;是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。简单来说就是用于管理多人协同开发项目的技…

【链表】Leetcode 142. 环形链表 II【中等】

环形链表 II 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系…

YoloV8改进策略:BackBone改进|PKINet

摘要 PKINet是面向遥感旋转框的主干,网络包含了CAA、PKI等模块,给我们改进卷积结构的模型带来了很多启发。本文,使用PKINet替代YoloV8的主干网络,实现涨点。PKINet是我在作者的模型基础上,重新修改了底层的模块,方便大家轻松移植到YoloV8上。 论文:《Poly Kernel Ince…

zabbix企业微信的告警媒介配置

简介&#xff1a; Zabbix企业微信告警媒介可用于向特定群组成员发送提醒通知。 前提条件&#xff1a; 完成Zabbix告警平台的搭建后&#xff0c;需将群机器人添加至告警提醒群中。 企业微信群聊——右上角三个点——添加群机器人 保存好产生的webhook地址&#xff08;注意&…

Kotlin的lateinit关键词

Kotlin的lateinit关键词 lateinit&#xff0c;延迟初始化。有时&#xff0c;并不能定义一个变量或对象值为空&#xff0c;而也没办法在对象或变量在定义声明时就为它赋值初始化&#xff0c;那么这时就需要用到Kotlin提供的延迟初始化lateinit。比如&#xff0c;有些依赖注入框架…

Docker可视化管理工具DockerUI

什么是 DockerUI &#xff1f; DockerUI 是一款开源的、强大的、轻量级的 Docker 管理工具。DockerUI 覆盖了 docker cli 命令行 95% 以上的命令功能&#xff0c;通过可视化的 Web 界面操作&#xff0c;可以非常方便、轻松进行 docker 环境和 docker swarm 集群环境的管理和维护…

二分算法(查找)

问题&#xff1a;在数组中查找某一个数字x4的下标 例&#xff1a;arr:1 3 4 6 10 20 21 22 显然&#xff0c;数字4的下标为3。 1、线性查找&#xff0c;一个个地去遍历&#xff0c;时间复杂度为O(n) 2、二分查找&#xff0…

Centos7虚拟机中oracle19c数据库安装

目录[-] 1. Centos7虚拟机中oracle19c数据库安装 1.1. 1.先诀条件1.2. 2.oracle19c安装准备(root用户下执行)1.3. 3.CentOS7上安装oracle19c 1.先诀条件 本文在安装oracle19c时,各项oracle配置操作都通过图形界面进行。因此CentOS7系统需要安装gnome图形程序,虚拟机安装时未…

【自编码器】梳理(上)

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 梳理有关自编码器 1. 自编码器 1.1 原理 Auto-Encoder&#xff0c;中文称作自编码器&#xff0c;是一种无监督式学习模型。利用输入数据 X X X本身作…

苍穹外卖笔记

苍穹外卖 DAY01nginx反向代理MD5加密yapi进行接口导入Swagger介绍 DAY02新增员工需求分析和设计写相关代码测试(1. 后端文档测试 2. 前后端联调代码完善 员工分页查询DAY01 02涉及到的知识 DAY01 nginx反向代理 MD5加密 拓展&#xff1a;spring security jwt 提供了更强大灵…

实战高效RPC方案在嵌入式环境中的应用与揭秘

实战高效RPC方案在嵌入式环境中的应用与揭秘 开篇 在嵌入式系统开发中&#xff0c;大型项目往往采用微服务架构来构建&#xff0c;其核心思想是将一个庞大的单体应用分割成一系列小型、独立、松耦合的服务模块&#xff0c;这些模块可以是以线程或进程形式存在的多个服务单元。…

C语言动态内存的管理

前言 本篇博客就来探讨一下动态内存&#xff0c;说到内存&#xff0c;我们以前开辟空间大小都是固定的&#xff0c;不能调整这个空间大小&#xff0c;于是就有动态内存&#xff0c;可以让我们自己选择开辟多少空间&#xff0c;更加方便&#xff0c;让我们一起来看看动态内存的有…

yolov5训练并生成rknn模型部署在RK3588开发板上,实现NPU加速推理

简介 RK3588是瑞芯微&#xff08;Rockchip&#xff09;公司推出的一款高性能、低功耗的集成电路芯片。它采用了先进的28纳米工艺技术&#xff0c;并配备了八核心的ARM Cortex-A76和Cortex-A55处理器&#xff0c;以及ARM Mali-G76 GPU。该芯片支持多种接口和功能&#xff0c;适…

python写爬虫爬取京东商品信息

工具库 爬虫有两种方案&#xff1a; 第一种方式是使用request模拟请求&#xff0c;并使用bs4解析respond得到数据。第二种是使用selenium和无头浏览器&#xff0c;selenium自动化操作无头浏览器&#xff0c;由无头浏览器实现请求&#xff0c;对得到的数据进行解析。 第一种方…

分布式技术知识体系

分布式架构知识与技术 1.分布式相关理论与组件原理 理解分布式基础理论&#xff08;CAP/BASE&#xff09; 掌握分布式必知必会的核心知识与技能 摸清分布式系统研发与设计的各个环节 2.分布式相关技术及实践 掌握分布式各应用场景与实践技术栈 熟练运用分布式中间件 完成软件…

java面向对象编程基础

对象&#xff1a; java程序中的对象&#xff1a; 本质上是一种特殊的数据结构 对象是由类new出来的&#xff0c;有了类就可以创建对象 对象在计算机的执行原理&#xff1a; student s1new student();每次new student(),就是在堆内存中开辟一块内存区域代表一个学生对象s1变…

第十届蓝桥杯大赛个人赛省赛(软件类)真题- CC++ 研究生组-最短路

6 肉眼观察&#xff0c; 看起来短的几条路对比下来是6~ #include <iostream> using namespace std; int main() {printf("6");return 0; }

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费&#xff0c;70元。据说可以导出 Verilog &#xff01;