关系数据库设计基础:函数依赖、码与多值依赖详解

关系数据库设计基础:函数依赖、码与多值依赖详解

数据库设计是构建高效、可靠系统的核心环节。今天我们将通过生活案例+专业定义的双重视角,深入解析函数依赖、码和多值依赖的奥秘!


一、函数依赖:数据的“身份证”规则

1. 什么是函数依赖?

生活视角🔍

假设你有一张学生表,每个学生的学号唯一对应其姓名、年龄等信息。这就是典型的函数依赖关系:知道学号,就能确定其他信息。

专业定义📖

设关系模式 ( R(U) ) 是属性集 ( U ) 上的关系,( X ) 和 ( Y ) 是 ( U ) 的子集。若对于 ( R(U) ) 的任何可能关系 ( r ),不存在两个元组在 ( X ) 上的值相等而在 ( Y ) 上的值不等,则称 ( X ) 函数决定 ( Y ),记作 ( X → \rightarrow Y )。
关键点:函数依赖是语义层面的约束,与当前数据无关,而是由业务规则决定。


2. 完全依赖 vs 部分依赖

生活比喻🌰

完全依赖:就像打开保险箱需要所有密码数字(缺一不可)。
部分依赖:像用一串钥匙中的任意一把就能开门(存在冗余)。

专业解释🔬

完全函数依赖:若 ( X → \rightarrow Y ),且对 ( X ) 的任意真子集 ( X’ ),( X’ ↛ \nrightarrow Y ),则称 ( Y ) 完全依赖于 ( X ),记作 ( X → f \stackrel{f}{\rightarrow} f Y )。
示例:在选课表 ( (学号, 课程号) → \rightarrow 成绩 ) 中,单独学号或课程号都无法确定成绩。

部分函数依赖:若 ( X → \rightarrow Y ),但存在 ( X ) 的真子集 ( X’ ) 使得 ( X’ → \rightarrow Y ),则称 ( Y ) 部分依赖于 ( X ),记作 ( X → p \stackrel{p}{\rightarrow} p Y )。
示例:在冗余的选课表 ( (学号, 课程号) → \rightarrow 姓名 ) 中,仅学号就能确定姓名。


3. 传递依赖:数据的“多米诺骨牌”

生活场景🏢

供应商表中存在链式关系:
供应商号 → 信用等级 → 折扣率
信用等级决定折扣率,但信用等级本身由供应商号决定。

专业定义📝

在关系模式 ( R(U, F) ) 中,若存在 ( X → \rightarrow Y )、( Y → \rightarrow Z ),且 ( Y ↛ \nrightarrow X ),则称 ( Z ) 传递依赖于 ( X ),记作 ( X → t \stackrel{t}{\rightarrow} t Z )。
关键点:传递依赖会导致数据冗余和更新异常,需通过模式分解消除。


二、码(Key):数据的唯一标识

1. 候选码与主码

生活类比🔑

候选码:像多个能打开同一把锁的钥匙(如学号、身份证号)。
主码:从候选码中选出一把“常用钥匙”(如学号)。

专业术语📚

候选码:若属性组 ( K ) 满足 ( K → \rightarrow U )(决定所有属性),且 ( K ) 的任意真子集 ( K’ ) 都不满足 ( K’ → \rightarrow U ),则 ( K ) 为候选码。
主码:从候选码中选定的一个作为唯一标识。
主属性:包含在任一候选码中的属性;非主属性则是其他属性。

示例
• 学生表候选码:学号
• 选课表候选码:(学号, 课程号)


2. 外码:表与表的“契约精神”

生活例子📝

学生表中的“所属学院”字段,必须引用学院表中的“学院编号”,否则可能出现“幽灵学院”。

专业定义📜

若关系模式 ( R(U) ) 中的属性组 ( X ) 不是 ( R ) 的候选码,但 ( X ) 是另一关系模式 ( S ) 的候选码,则称 ( X ) 为 ( R ) 的外码
作用:维护参照完整性,限制非法数据插入。


三、多值依赖:一对多的“自由组合”

1. 什么是多值依赖?

生活案例📚

课程表设计为 (课程, 教师, 参考书)
• 一门课程(如数学)对应多个参考书
• 参考书的选择与教师无关

专业定义🔍

在关系模式 ( R(U) ) 中,设 ( X, Y, Z ) 是 ( U ) 的子集,且 ( Z = U - X - Y )。若对任意关系 ( r ),给定 ( (x, z) ),存在一组 ( Y ) 的值仅由 ( x ) 决定(与 ( z ) 无关),则称 ( Y ) 多值依赖于 ( X ),记作 ( X → → \rightarrow\rightarrow →→ Y )。

数学表达
若 ( X → → \rightarrow\rightarrow →→ Y ),则对 ( r ) 中任意两个元组 ( t_1, t_2 ),若 ( t_1[X] = t_2[X] ),必存在元组 ( t_3, t_4 ) 使得:
• ( t_3[X] = t_4[X] = t_1[X] )
• ( t_3[Y] = t_1[Y] ),( t_3[Z] = t_2[Z] )
• ( t_4[Y] = t_2[Y] ),( t_4[Z] = t_1[Z] )


2. 多值依赖的实战意义

问题示例🚨

原始表:

课程教师参考书
数学王老师数学分析
数学王老师线性代数
数学张老师数学分析
数学张老师线性代数

问题:教师和参考书组合爆炸式增长,导致冗余。

解决方法✅

分解为两张表满足第四范式(4NF):

  1. 课程-教师表

    课程教师
    数学王老师
    数学张老师
  2. 课程-参考书表

    课程参考书
    数学数学分析
    数学线性代数

总结:数据库设计的三大核心逻辑

概念生活比喻专业本质设计意义
函数依赖身份证号决定个人信息数据一致性的语义约束消除冗余,保证数据准确
唯一钥匙数据实体的唯一标识确保数据可唯一识别
多值依赖课程与参考书的自由组合独立的多值关联关系分解冗余,优化存储结构

掌握这三个概念,你就能像侦探破案一样,从混乱的数据中梳理出清晰的逻辑关系! 🔍💡

参考教材《数据库系统工程师教程》!

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

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

相关文章

失败的面试经历(ʘ̥∧ʘ̥)

一.面向对象的三大特性 1.封装:将对象内部的属性私有化,外部对象不能够直接访问,但是可以提供一些可以使外部对象操作内部属性的方法。 2.继承:类与类之间会有一些相似之处,但也会有一些异处,使得他们与众…

qt加载VeloView工程

接上一篇点云软件配置与编译,使用qt加载需要先完成编译。编译完成后到编译目录下lidarview-superbuild\common-superbuild\lidarview\build 找到CmakeCache.txt,如下是我的编译目录。 使用QT6.5.3加载了CmakeCache.txt,QT5.14还加载不了cmake…

Windows Qt动态监测系统分辨率及缩放比变化

前言 Windows 显示设置中,可以修改缩放比,所有界面和文字会同比例放大或缩小,在开发桌面程序时, 实时监测Qt应用程序在不同缩放比例下的表现,可以及时调整程序界面以适应不同显示屏幕的需求。 正文 本文通过Qt相关…

CVE-2017-5645(使用 docker 搭建)

介绍: 是一个与 Apache Log4j2 相关的安全漏洞,属于远程代码执行,它可能允许攻击者通过构造恶意的日志信息 在目标系统上执行任意代码 Log4j2 介绍 Log4j2 是 Apache 的一个日志记录工具,属于 Java 应用的日志框架,它是 Log4j 的升级版,性能更好,功能更多.它被广泛的适用于 J…

交互式可视化进阶(Plotly Dash构建疫情仪表盘)

这里写目录标题 交互式可视化进阶(Plotly Dash构建疫情仪表盘)1. 引言2. 项目背景与意义3. 数据集生成与介绍4. GPU加速在数据处理中的应用5. 交互式仪表盘构建与Plotly Dash6. PyQt GUI集成与美化7. 工程整体架构8. 部分代码实现9. 代码自查与BUG排查10. 总结与展望交互式可…

RabbitMQ(补档)

RabbitMQ 是一个开源的消息队列软件(有时也被称为消息代理),它实现了高级消息队列协议(AMQP)。它主要用于应用程序之间,或者软件组件之间的消息通信。通过使用 RabbitMQ,可以实现异步的、可靠的…

平方矩阵问题

Ⅰ 回字形二维数组 #include <iostream> #include <iomanip> using namespace std; int main(){int n;while(cin>>n,n){for(int i0; i<n;i){for(int j0; j<n; j){int upi, downn-i1, leftj, rightn-j1;cout<<min(min(up,down),min(left,right)…

电子电气架构 --- 智能座舱和车载基础软件简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人生是一场骗局,最大的任务根本不是什么买车买房,也不是及时行乐,这就是欲望,不是理想,是把自己对生命的希望寄托在外物上,正确的做法应该是内…

Qt 通过MSVC编译运行项目

第一步下载Qt 把Qt能选的插件都选上&#xff0c;有的是连接数据库必须得插件&#xff0c;有的是做图表必须得插件&#xff0c;有的是运行MSVC必须得插件&#xff0c;能选尽量都选上。 第二步安装VS2017&#xff0c;当然我们安装2017的目的主要是用C的编译器&#xff0c;这里提…

高效手机检测:视觉分析技术的优势

在当今社会&#xff0c;手机已成为人们日常生活和工作中不可或缺的工具。然而&#xff0c;在某些特定场合&#xff0c;如考场、工作场所等&#xff0c;手机的使用却可能带来负面影响。因此&#xff0c;如何有效监测和防止在这些场合偷用手机的行为&#xff0c;成为了一个亟待解…

Gitee重新远程连接仓库(Linux)

Gitee重新远程连接仓库&#xff08;Linux&#xff09; 因为虚拟机重新安装了一回&#xff0c;所以需要重新和远程仓库连接&#xff0c;在网上找了很久没有找到相关操作&#xff0c;自己实操成功&#xff0c;记录下本博客&#xff0c;帮助有需要的人 确保新虚拟机安装Git 在新虚…

【论文笔记】FFA-Net: Feature Fusion Attention Network for Single Image Dehazing

文章目录 1. 研究背景2. FFA - Net网络结构3. 实验结果4. 研究贡献5. 重点详解1. 通道注意力&#xff08;Channel Attention, CA&#xff09;通道注意力的实现步骤&#xff1a; 2. 像素注意力&#xff08;Pixel Attention, PA&#xff09;像素注意力的实现步骤&#xff1a; 3. …

计算机视觉cv2入门之图像的读取,显示,与保存

在计算机视觉领域&#xff0c;Python的cv2库是一个不可或缺的工具&#xff0c;它提供了丰富的图像处理功能。作为OpenCV的Python接口&#xff0c;cv2使得图像处理的实现变得简单而高效。 示例图片 目录 opencv获取方式 图像基本知识 颜色空间 RGB HSV 图像格式 BMP格式 …

深度学习中的向量的样子-DCN

深度学习中向量都是 竖着的&#xff0c;譬如 DCN中的计算逻辑

OBS推WebRTC流,并添加毫秒级时间显示

作者在用OBS推WebRTC流&#xff0c;并用浏览器观看推送的实时流。另外就是想看一下延迟有多少。采用一台电脑&#xff0c;流媒体服务器为SRS&#xff0c;相关配置比较简单&#xff0c;可以自行搜索。 推送的流 http://localhost:1985/rtc/v1/whip/?applive&streamlivestr…

【MySQL】多表操作 —— 外键约束

目录 多表关系一对一关系一对多/多对一关系多对多关系 外键约束基本概念一对多/多对一创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多对多创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多表关系 MySQL 多表之间的关系可以概括为&#…

82.HarmonyOS NEXT 性能优化指南:从理论到实践

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 性能优化指南&#xff1a;从理论到实践 文章目录 HarmonyOS NEXT 性能优化指南&#xff1a;从理论到实践1. 性能优化概述1.1 性能指…

树莓派急速安装ubuntu;映射磁盘与储存磁盘文件;ubuntu映射整个工程;保存系统工作状态

一、用途 在使用树莓派上下载ubuntu时&#xff0c;需要一张sd卡&#xff0c;当你需要给这张卡做备份的时候&#xff0c;可以是使用磁盘映射软件&#xff0c;从而达到备份的目的 同时有一些大佬发布了ubuntu的映射文件&#xff0c;可以直接使用该文件&#xff0c;然后还原他的整…

Qt 控件概述 QPushButton 与 QRadioButton

目录 QPushButton setIcon 设置图标 setShortCut 设置快捷键 setAutoRepeat : 设置是否连发 ​编辑RadioButton 槽函数 单选按钮的分组排异 QPushButton QPushButtoon继承于QAbstractButton(抽象类)&#xff1b; QAbstract中与QPushButton关联性极大的属性 ​ setIcon…