识别传递依赖

时间:2014-12-10 04:28:45

标签: sql database database-design 3nf

所以,我相信我对全功能依赖关系和部分依赖关系有所了解。我将提供一个简短的解释,如果我做错了什么,我不会在兔子洞里走得太远。

我正在使用一个包含两个属性的复合主键的表,表中总共有10个属性,为1NF格式。

在我的情况下,完全功能的依赖涉及依赖于我的主键中的BOTH属性。部分依赖关系依赖于主键中的任一属性。传递依赖涉及函数依赖中的两个或多个非键属性,其中一个非键属性依赖于键属性(来自我的PK)。

假设我没有弄错,无论我的理解如何,将传递的依赖性从表中拉出来都会让我的大脑陷入困境。看起来你会在规范化之后这样做,但是我的任务要求我们“识别所有功能依赖性”。在绘制依赖关系图之前,我们将表格规范化。

我将列出表中的属性,然后列出提供的业务规则 - 括号标识PK属性:

(Student ID), Student Name, Student Address, Student Major, (Course ID), Course Title, Instructor ID, Instructor Name, Instructor Office, Student_crse_grade

Only one class is taught for each course ID. Students may take up to 4 courses. Each course may have a maximum of 25 students. Each course is taught by only one Instructor. Each student may have only one major.

2 个答案:

答案 0 :(得分:2)

从您的问题来看,您似乎对基础知识没有一个清晰的认识。

应用关系和情况

首先,您必须了解您的应用程序(包括先验规则),并确定应用程序关系。每个都获得一个基表(又名关系)。这种应用程序关系的特征在于行成员标准(aka谓词)(aka含义)。例如,假设标准"学生[student_id]参加课程[course_title]"有桌子TAKES。标准的参数是其表的列。我们可以使用带有列的表名(如SQL声明)作为标准的简写。例如TAKES(student_id,course_title)。标准加上一行作出陈述(命题)。例如,行(17,' CS101')给出"学生17选择课程' CS101'"即TAKES(17,' CS101')。提供真实陈述的行会出现在表格中,而行会出现虚假陈述。

如果我们可以将一个标准分成两个AND组在一起,那么我们只需要具有新标准的表。这是因为定义了JOIN,以便包含使其条件为真的行的两个表的JOIN返回使其条件的AND为真的行。所以我们可以加入两个表来取回原始表。 (这是规范化通过将表分解为组件来实现的。)

-- student with id [si] has name [sn] and address [sa] and major [sm]
    and takes course [ci] with title [ct]
        from instructor with id [ii] and name [in] and office [io]
        with grade [scg]
T(si,sn,sa,sm,ci,ct,ii,in,io,scg)

-- student with id [si] has name [sn] and address [sa] and major [sm]
    and takes course [ci] with grade [scg]
SG(si,sn,sa,sm,ci,scg)

--  course [ci] with title [ct]
        is taught by instructor with id [ii] and name [in] and office [io]
CI(ci,ct,ii,in,io,scg)

-- T(si,sn,sa,sm,ci,ct,ii,in,io,scg) IFF
    SG(si,sn,sa,sm,ci,scg) AND CI(ci,ct,ii,in,io,scg)
-- T = SG JOIN CI

应用程序关系和情境一起确定规则和FD(以及其他约束)!它们只适用于每种应用程序情况或每个数据库状态(即一个或多个基表的值)(它们是标准和可能的应用程序情况的函数。)然后我们规范化以减少冗余。

规则只能告诉你一些你不知道的(假定的)标准和(假定的)情况已经知道的事情,那就是当你不真正理解时标准或什么情况可以出现,先验规则澄清了一些事情。为您提供规则的人已经在使用他们认为您理解的应用程序关系,并且他们只能确定使用它们的规则以及可能出现的所有应用程序情况 (虽然是非正式的)!

(遗憾的是,许多信息建模的演示文稿甚至没有提及应用程序关系。例如:如果有人说"存在X:Y关系"那么他们必须已经考虑到实体之间的特定的二进制应用程序关系;知道它和可能出现的应用程序情况,它们报告它在某个方向上具有某种基数。这将对应于某些应用程序关系和故事使用标识实体的列集。)

(查看对象角色建模或Nijssen对他的NIAM的演示。)

FDs,CKs和规范化

考虑到将行放入或离开表的标准以及可能出现的所有可能情况,只有一些值(行集)可以在该表中。

对于列的每个子集,您需要确定哪些其他列对于这些列的给定子行值只能有一个值。当它只能有一个我们说列的子集在功能上确定该列。但是该子集的每个超集也将在功能上确定它,从而减少案例。相反,如果给定集合未确定列,则该集合的子集不会。此外,您可能会认为列集是唯一的;然后所有其他列在功能上依赖于该集合。这样的集合称为超级密钥。

只有在确定了FD后才能确定候选键! CK是一个超级密钥,它不会占用更小的超级密钥。 (CK和超级密钥的存在也是约束。)我们可以选择CK作为主键。

  

部分依赖依赖于其中一个属性   主键。

不要使用"涉及"或者"依赖于"给出一个定义。说,"当"或者"当且仅当"。

阅读定义。当且仅当使用行列式的适当子集给出具有相同确定列的FD时,FD是部分的;否则就满了。请注意,这不涉及CK。当所有非素数属性在功能上完全依赖于每个CK时,关系为2NF。

  

传递依赖涉及a中的两个或多个非键属性   功能依赖,其中一个非关键属性是依赖的   关键属性(来自我的PK)。

阅读定义。 S - >当存在X时,T是可传递的,其中S - > X和X - > T而不是(X - > S)。请注意,这不涉及CK。当它在2NF时,关系在3NF,并且所有非素数属性都是非传递性依赖于每个CK。

答案 1 :(得分:0)

我推断出业务规则中未列出的功能依赖项。即,教师ID确定教师姓名。

如果这是真的,并且如果课程表中同时具有教师ID和教师名称,那么这不在3NF中,因为课程ID,教师ID和教师姓名之间存在传递依赖关系。

为什么这有害?因为在教师讲授的每门课程中复制教师姓名会使教师姓名更新变得困难,并且可能以不一致的方式进行。不一致的教师姓名只是你必须注意的另一个错误,3NF可以避免这个问题。教师办公室可以提出同样的论点。