数据库模式分解:如何判定“保持函数依赖”?

文章目录

  • 数据库模式分解:如何判定“保持函数依赖”?
    • 一、先搞懂:什么叫“保持函数依赖”?
    • 二、判定保持函数依赖的标准思路
    • 三、考试常用“快速判断法”
    • 四、严格判定:用“跨子模式闭包扩展”算法
    • 五、用一个例子串起来
      • 1. 看每个依赖落在哪里
      • 2. 合并依赖集
      • 3. 判定结果
    • 六、容易踩的三个坑
      • 坑 1:把“保持函数依赖”当成“无损连接”
      • 坑 2:依赖被拆开就直接判“不保持”
      • 坑 3:只检查“直接出现”,不做闭包推导
    • 七、做题模板

数据库模式分解:如何判定“保持函数依赖”?

关系模式分解里,有两个最容易混的概念:

  • 无损连接:拆完表后,能不能通过自然连接把数据完整拼回去。
  • 保持函数依赖:拆完表后,原来的业务约束是否还能被“找回来”。

这篇只讲后者:怎么判定一个分解是否保持函数依赖。

一、先搞懂:什么叫“保持函数依赖”?

设关系模式是:

R ( U , F ) R(U, F)R(U,F)

其中:

  • U UU是属性集;
  • F FF是原函数依赖集;
  • 把R RR分解成若干子模式:R 1 , R 2 , … , R k R_1, R_2, \dots, R_kR1​,R2​,…,Rk​。

如果F FF中的每个函数依赖,都能由分解后各子模式上的函数依赖推导出来,那么这个分解就是保持函数依赖的。

通俗一点说:

原来的规则,拆表之后不能丢。
要么某个依赖完整地落在某张子表里;
要么虽然被拆开了,但通过各子表的依赖联合推导,仍然能恢复出来。

注意:保持函数依赖 ≠ 无损连接。
一个分解可以保持依赖但不是无损连接;也可以无损连接但不保持依赖。

二、判定保持函数依赖的标准思路

判定流程可以分成四步。

第一步:列出原函数依赖集F FF

先把题目给出的所有函数依赖写清楚,例如:

F = { A → B , A → C , C → D , A E → G } F = \{A \rightarrow B,\ A \rightarrow C,\ C \rightarrow D,\ AE \rightarrow G\}F={A→B,A→C,C→D,AE→G}

后面每一步都要围绕这个集合检查。

第二步:对每个子模式求“投影依赖”

对每个子模式R i R_iRi​,找出那些左右属性都落在R i R_iRi​中的函数依赖。

例如:

  • 若R 1 ( A , B , C , D ) R_1(A, B, C, D)R1​(A,B,C,D),
  • 原依赖中有A → B A \rightarrow BA→B、A → C A \rightarrow CA→C、C → D C \rightarrow DC→D,
  • 那么这些依赖都可以在R 1 R_1R1​上保持。

如果某个依赖的左边或右边属性不在R i R_iRi​中,它就不能直接归入R i R_iRi​的投影依赖集。

第三步:合并所有子模式的依赖集

把所有子模式能“认领”的依赖合并起来,记为:

G = ⋃ i = 1 k F i G = \bigcup_{i=1}^{k} F_iG=i=1⋃k​Fi​

其中F i F_iFi​是F FF在R i R_iRi​上的投影依赖集。

第四步:检查F FF中每个依赖是否都能被G GG推导出来

对F FF中的每个依赖X → Y X \rightarrow YX→Y,判断:

Y ⊆ X G + Y \subseteq X_G^+Y⊆XG+​

也就是说,用合并后的依赖集G GG计算X XX的闭包,看能否推出Y YY。

如果所有依赖都能被推出,则分解保持函数依赖;
只要有一个推不出,就不保持。

三、考试常用“快速判断法”

做选择题时,通常可以先用这个简化判断:

如果一个函数依赖的左右属性都完整出现在某个子模式中,那它一定被保持。
如果某个依赖被拆到不同子模式里,且无法通过其他依赖推导出来,那它就可能丢失。

但要注意:
被拆开 ≠ 一定不保持。
因为可能存在传递推导。例如:

  • R 1 ( A B ) R_1(AB)R1​(AB)上有A → B A \rightarrow BA→B;
  • R 2 ( B C ) R_2(BC)R2​(BC)上有B → C B \rightarrow CB→C;
  • 那么A → C A \rightarrow CA→C虽然不在任何单张子表中,但可以通过A → B A \rightarrow BA→B、B → C B \rightarrow CB→C推导出来,因此仍可能被保持。

所以严格判定还是要看闭包。

四、严格判定:用“跨子模式闭包扩展”算法

当某个依赖被拆散时,不能直接判“不保持”,需要用更通用的方法。

对F FF中的每个依赖X → Y X \rightarrow YX→Y:

  1. 初始化:
    r e s u l t = X result = Xresult=X

  2. 对每个子模式R i R_iRi​:

    • 计算:
      t e m p = r e s u l t ∩ R i temp = result \cap R_itemp=result∩Ri​
    • 求t e m p temptemp关于原依赖集F FF的闭包:
      t e m p + temp^+temp+
    • 取回落在R i R_iRi​内的属性:
      t = t e m p + ∩ R i t = temp^+ \cap R_it=temp+∩Ri​
    • 更新:
      r e s u l t = r e s u l t ∪ t result = result \cup tresult=result∪t
  3. 重复第 2 步,直到r e s u l t resultresult不再变化。

  4. 最后判断:
    如果Y ⊆ r e s u l t Y \subseteq resultY⊆result,则X → Y X \rightarrow YX→Y被保持;否则不保持。

这个算法的本质是:
利用每个子模式内部能推出的属性,逐步扩大左部能决定的范围,看最终能不能覆盖右部。

五、用一个例子串起来

设:

U = { A , B , C , D , E , G } U = \{A, B, C, D, E, G\}U={A,B,C,D,E,G}

F = { A → B , A → C , C → D , A E → G } F = \{A \rightarrow B,\ A \rightarrow C,\ C \rightarrow D,\ AE \rightarrow G\}F={A→B,A→C,C→D,AE→G}

分解为:

  • R 1 ( A , B , C , D ) R_1(A, B, C, D)R1​(A,B,C,D)
  • R 2 ( A , E , G ) R_2(A, E, G)R2​(A,E,G)

1. 看每个依赖落在哪里

  • A → B A \rightarrow BA→B:属性都在R 1 R_1R1​,保持。
  • A → C A \rightarrow CA→C:属性都在R 1 R_1R1​,保持。
  • C → D C \rightarrow DC→D:属性都在R 1 R_1R1​,保持。
  • A E → G AE \rightarrow GAE→G:属性都在R 2 R_2R2​,保持。

2. 合并依赖集

合并后得到:

G = { A → B , A → C , C → D , A E → G } G = \{A \rightarrow B,\ A \rightarrow C,\ C \rightarrow D,\ AE \rightarrow G\}G={A→B,A→C,C→D,AE→G}

这和原依赖集完全一致。

3. 判定结果

因为F FF中每个依赖都能由G GG直接推出,所以该分解保持函数依赖。

六、容易踩的三个坑

坑 1:把“保持函数依赖”当成“无损连接”

保持依赖看的是规则有没有丢;
无损连接看的是数据能不能拼回去。
两者要分别判定。

坑 2:依赖被拆开就直接判“不保持”

比如A → C A \rightarrow CA→C没有直接出现在任何子表中,但如果子表中有:

  • A → B A \rightarrow BA→B
  • B → C B \rightarrow CB→C

那么A → C A \rightarrow CA→C仍可能被推导出来。

坑 3:只检查“直接出现”,不做闭包推导

严格做法是:
对每个X → Y X \rightarrow YX→Y,计算X XX在合并依赖集下的闭包,看是否包含Y YY。

七、做题模板

以后遇到“是否保持函数依赖”的题,可以按这个顺序写:

  1. 写出原函数依赖集F FF。
  2. 对每个子模式R i R_iRi​,写出它能保持的依赖F i F_iFi​。
  3. 合并得到G = ⋃ F i G = \bigcup F_iG=⋃Fi​。
  4. 对F FF中每个X → Y X \rightarrow YX→Y,判断Y ⊆ X G + Y \subseteq X_G^+Y⊆XG+​。
  5. 全部成立 → 保持函数依赖;
    有一个不成立 → 不保持函数依赖。

如果是选择题,通常可以先用“左右属性是否完整落在某个子模式中”快速排除;遇到跨表依赖,再用闭包扩展法确认。

相关新闻

从自回归解码到世界模型:AI长程规划能力为何缺失及改进路径

从自回归解码到世界模型:AI长程规划能力为何缺失及改进路径

最近我在折腾一个多步骤任务型 Agent,又一次被同一个问题卡住:模型单步决策表现相当好,但让它完成一条长链路规划,就开始跑偏。更恼火的是,它跑到错误分支上还会一本正经地继续生成,完全意识不到自己已经走…

2026/10/21 2:22:51 阅读更多 →
DeepSeek高效使用指南:从提示词入门到进阶实战

DeepSeek高效使用指南:从提示词入门到进阶实战

1. 全面认识DeepSeek:能力边界与核心优势1.1 这不是又一个聊天机器人DeepSeek这个名字最近出现在各种技术社区和聊天群里,频率高得让人不得不关注。但说实话,很多人下载安装之后,用了一两次就扔在一边,给出的评价是“也…

2026/10/21 2:22:51 阅读更多 →
DeepSeek应用指南:提示词、API与本地部署实战

DeepSeek应用指南:提示词、API与本地部署实战

DeepSeek实战秘籍:从基础到高级的完整应用指南最近DeepSeek的热度大家有目共睹,作为一个完全开源的国产大模型,它在推理能力、代码生成、数学解题等方面的表现确实让人惊艳。更重要的是,它不是一个只能用来“聊天”的玩具——把它…

2026/10/21 2:22:51 阅读更多 →

最新新闻

无人机航拍小目标检测数据集构建:从场景设计到智慧交通与应急救援落地

无人机航拍小目标检测数据集构建:从场景设计到智慧交通与应急救援落地

我做无人机视觉落地也有几年了,今年被问得最多的问题不是“模型怎么调”,而是“模型怎么到了现场就不灵”。很多朋友拿着公开的航拍检测模型,在桌面演示上mAP能到七八十个点,可一部署到国内的十字路口、老小区、城乡结合部&#x…

2026/10/21 3:07:07 阅读更多 →
Seay源代码审计系统实战:PHP漏洞扫描与规则扩展

Seay源代码审计系统实战:PHP漏洞扫描与规则扩展

简介:Seay源代码审计系统是一款基于C#开发的PHP代码安全审计工具,主要运行于Windows平台,面向网络安全初学者、CTF/AWD参赛选手及渗透测试人员,用于快速定位PHP项目中的安全隐患。它能够识别SQL注入、代码执行、命令执行、文件包含…

2026/10/21 3:07:07 阅读更多 →
Seay源代码审计系统实战:PHP静态代码审计与AWD快速排查指南

Seay源代码审计系统实战:PHP静态代码审计与AWD快速排查指南

简介:Seay源代码审计系统是一款基于C#开发的PHP代码安全审计工具,主要运行于Windows平台,面向网络安全初学者、CTF/AWD参赛选手及渗透测试人员,用于快速定位PHP项目中的安全隐患。它可检测SQL注入、代码执行、命令执行、文件包含、…

2026/10/21 3:07:07 阅读更多 →
程序员 AI 出图避坑:椒图 AI 与 Nano Banana Pro 实战指南

程序员 AI 出图避坑:椒图 AI 与 Nano Banana Pro 实战指南

如果你也是那种被拉去“顺带做个图”就浑身难受的程序员,这篇文章应该能帮你省下不少救心丸。我自己的本职是写后端,大部分时间对着终端和接口文档,但只要涉及方案评审、产品汇报、开源项目宣传,就逃不开一个尴尬任务:…

2026/10/21 3:07:07 阅读更多 →
从能生成到有质感:Seedance 2.0镜头语言全解析

从能生成到有质感:Seedance 2.0镜头语言全解析

先说一个我自己的真实感受:第一次用 Seedance 2.0 生成视频时,我很兴奋,因为画面真的“能动了”。但等我把五六段素材拼到一起,越看越不对劲——画面在动,情绪却没动;每个镜头单拎出来都不差,连…

2026/10/21 3:07:07 阅读更多 →
RAG效果差?问题多半出在知识库管理:清洗、分块与治理实战

RAG效果差?问题多半出在知识库管理:清洗、分块与治理实战

先说明一点:这个标题我深有同感。做了大半年RAG相关的东西,见过不少团队把精力全压在召回链路调参上,结果效果上不去,最后排查一圈,问题全出在知识库本身——脏数据、错分块、无版本、无评测,源头一乱&…

2026/10/21 3:06:07 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →