功能依赖与规范化

18

我正在寻找一些学习函数依赖和规范化的好资源。

有没有人知道应该去哪里找?我很难区分一个FD是否在1NF、2NF或3NF中。

我一直在阅读维基百科并使用谷歌搜索好的研究资料,但是找不到任何用简单术语解释的资料。

也许你们可以分享一下在生活中如何学习FD和规范化。

6个回答

37

一个函数依赖定义了属性之间的函数关系。例如:PersonId 决定了 BirthDate(通常写作 PersonId -> BirthDate)。换句话说:对于任何给定的人,只有一个出生日期。请注意,反过来可能成立也可能不成立。许多人可能在同一天出生。给定一个 BirthDate,我们可以找到许多共享该日期的 PersonId

函数依赖的集合可用于合成关系(表)。前三个范式的定义,包括 Boyce Codd 范式(BCNF),都是根据给定关系表示函数依赖来说明的。第四和第五范式涉及多值依赖(另一个问题)。

以下是有关函数依赖、规范化和数据库设计的一些免费资源。在学习这些材料时,请准备好运用您的大脑和数学技能。

以下是各种学术网站上的“幻灯片展示”...

以下是学术论文。阅读较为繁重,但非常值得努力。

如果您真的对这个主题感兴趣,我建议您花钱购买一本好的关于关系数据库设计的书籍,例如:C.J. Date的《数据库系统简介》


4NF涉及多值依赖(MVDs),而5NF涉及连接依赖(JDs)。但是,二元JD对应于一对MVD(无论如何都成对出现)。因此,“第四和第五范式涉及” JDs(而不是MVDs)。 - philipxy

9
功能依赖是您的表格中列之间的约束。例如,在person表格中:
SSN         | Name         | Date of birth | Address     | Phone number 
------------------------------------------------------------------------
123-98-1234 | Cindy Cry    | 15-05-1983    | Los Angeles | 123-456-7891
121-45-6145 | John O'Neill | 30-01-1980    | Paris       | 568-974-2562
658-78-2369 | John Lannoy  | 30-01-1980    | Dallas      | 963-258-7413
在这里,列SSN(社会安全号码)中的值决定了列名、出生日期、地址和电话号码中的值。这意味着如果我们有“两行具有相同的SSN列值”,那么列名、出生日期、地址和电话号码中的值“将是相等的”。拥有SSN 123-98-1234的人总是被称为Cindy Cry,出生于15-05-1983年,等等。这种情况被称为“功能依赖”。
功能依赖的概念用于定义第二范式、第三范式和Boyce-Codd范式(BCNF)。

要了解有关函数依赖和规范化的更多信息,您可以阅读像C.J. Date的《数据库系统概念》等知名学术书籍,或者是H. Garcia-Molina、J.Ullman、J.Widom三位作者所写的任何图书

如果您想要一种较不正式的方法,我们在公司博客上开始发布有关数据规范化的系列文章


你的意思是,一个约束关系在列组之间,或在列组和列之间。(“之间”应该是指什么)。然而:FD通过给出2个列组或一个列组和一个列来表示,但它不是“在它们之间”的约束关系,它是整个表(值或变量)的约束关系,也涉及到它们。 - philipxy

5

什么是函数依赖?

函数依赖是规范化过程中的基本概念,描述表格中属性(列)之间的关系。换句话说,依赖FD:X → Y表示Y的值由X的值确定。共享相同X值的两个元组必然具有相同的Y值。 enter image description here

什么是数据库规范化?

数据库规范化是一种逐步正式的过程,可以将数据库表分解为最小化数据冗余和更新异常(有关更新异常的更多信息请参见上文)。

enter image description here Courtesy


NF是越来越强的条件。但我们不通过对较低的NF进行归一化来将其归一化到给定的NF,而是使用针对目标NF的算法。这并不意味着不同意,但是文本和/或第二个图可能会被理解为这样,因为在谈论归一化过程之后立即给出了该图。 - philipxy

4

4
我们可以这样理解函数依赖:假设我们有两个属性,其中一个属性完全依赖于另一个属性,则称为函数依赖。
举个现实生活的例子。我们知道每个人都有一个社会安全号码与其姓名对应。比如说,Frank是一个人,我们想知道这个人的社会安全号码,但是数据库无法提供这个信息,因为可能有很多人叫做Frank,但是我们可以根据社会安全号码确定一个人的姓名,所以姓名完全依赖于社会安全号码。

0

函数依赖

函数依赖可以被定义为关系中属性之间存在的关系。函数依赖用于创建 Boyce Codd 正规化(BCNF)中的关系。如果属性 C 函数确定属性 D,则 R 关系中的属性 C 和 D 之间的函数依赖可以表示为 C -> D。

例如:以下是 person 模式:

person(national_id, name, address);

在这里,national_id 函数决定了 person_name。因此,函数依赖是 national_id -> name;

在关系数据库设计中,函数依赖对于消除冗余非常重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接