数据关系中的函数依赖

想研究SQL范式的内容,不过需要依赖的概念知识。

因此特开一坑关于SQL的专栏,日后研究各种数据库和调优的事。

本文内容的来源于个人对数据库系统概论(第5版)的理解和例子的引用,豆瓣里对这本书褒贬不一,不过个人感觉虽然有的内容过于冗余抽象,但是静下心来还是能够有不少收获的,像书名的概论一样,理论的东西偏多,不是大多数programmer需要的工具书,不过个人感觉他的理论挺好的。

首先是引入关系模型的定义。

R<U,D,DOM,F> 理所当然,一个关系模式应当是一个五元组,不过模式设计中D、DOM的关系不大,因此可以看成R<U,F>三元组,文里也会就此展开研究。

那么R<U,F>的意义是什么呢?先把概念扒出来放着。
R:符号化的元组语义。
U:一组属性。
F:属性组U上的一组数据依赖。

先从数据依赖开始说吧。
数据依赖也有概念,关系内部属性与属性之间的一种约束关系就是数据依赖,而约束关系是通过属性间值的相等与否体现出来的数据间的相关联系。
到这里前先别放弃,例子要来了。

其中最要的数据依赖是函数依赖,FD。
例:描述学生关系,学号(Sno)、姓名(Sname)、系名(Sdept)。一个学号对应一个学生,一个学生只在一个系学习。因此当学号确定的时候,姓名和系名都可以确定,这样的关系类似于数学中函数y=f(x)的关系,自变量x确定,y的值就确定,因此也就称为函数关系了。
Sno决定Sname,Sno决定Sdept,或者说为Sname和Sdept函数依赖于sno,可以记为Sno→Sname,Sno→Sdept。

我们知道了函数依赖的概念,顺着这个例子拓展。
直接建立一个描述学校教务的数据库。
学号(Sno)、系名(Sdept)、系主任名字(Mname)、课程号(Cno)、成绩(Grade)。
通过分析我们又可以知道

  1. 一个系可以有若干学生,一个学生只能在一个系。(Sno→Sdept)
  2. 一个系只有一个(正)负责人,系主任。(Sdept→Mname)
  3. 一个学生可以选择多个课程,一个课程可以被多个学生选择。
  4. 每个学生学习课程都有对应的成绩。([Sno,Cno]→Grade)

那么Student上的函数依赖

数据关系中的函数依赖