3NF的定义

时间:2016-10-25 08:17:35

标签: database-normalization

我对3NF的定义感到困惑 设R是属性集X的关系 假设Y - >; A是函数依赖,其中A是非素数属性,Y是X的子集。

如果Y是R的任何候选键的适当子集,则该关系不在3NF中(甚至不在2NF中),因为这是部分依赖性,这在2NF(并且通过扩展3NF)中是不允许的。

如果Y是非素数属性,则该关系不在3NF中,因为这是非素数属性A通过非素数属性Y对任何候选键的传递依赖性。

但是如果Y是包含素数和非素数属性的集合呢?如果A是Y的子集怎么办?如果Y只包含素数属性,但那些素数属性来自R的不同键,那么Y不是R的任何特定键的适当子集?如果Y仅包含多个非素数属性,该怎么办?哪些案例违反了3NF的要求?为什么?

1 个答案:

答案 0 :(得分:1)

TL; DR 直接定义。

要了解案件是否违反3NF,您必须查看某些定义中使用的标准。

你的问题就像询问一样,我知道一个偶数可以被2整除,或者十进制表示结束于0,2,4,6或8,但如果它是三次,那该怎么办?广场?好吧,你必须使用定义 - 表明给定的条件意味着它可以被2整除,或者它的十进制表示以其中一个数字结束。为什么你甚至不关心定义中的其他属性?

当某些FD(功能依赖性)成立时,其他人也必须持有。我们说前者是暗示的。因此,当给予FD时,通常还有很多其他人持有。因此,持有的一个或多个任意FD并不一定会告诉您任何正常形式可能存在的任何内容。例如,当U是V的超集时,U→V必须保持;这些FD被称为琐事,因为它们被任何FD集合所暗示。例如,当U→V时,U的每个超集确定V的每个子集。 Armstrong的公理是一些可以机械地应用于找到所有FD的规则。有一些算法可以找到给定集合的规范/最小/不可约覆盖,一组FD暗示其中没有适当的子集。还有一些算法可以确定关系是否满足某些NF(正常形式),并在它们不存在时将它们分解为具有更高NF的组件。

有时候我们认为有一种情况是定义没有处理,但实际上我们的定义是错误的。

您尝试引用3NF关系的定义实际上要求非主要属性对候选键没有传递函数依赖。

在非3NF示例中,你应该说传递FD,而不是"这是传递FD",因为违反FD的形式是 CK →A不是Y→A。当存在X时,U→V是传递的,其中U→X和X→V而不是X→V.X是否是素数并不重要属性。

PS 询问"为什么"并不是很有帮助。数学中有些东西是或不是。我们用一些数字来描述一种情况,然后是一堆事情。我们可以说,如果某些恩赐不是那么,那么事情就不会如此。但是,如果某些其他赠品不是,那么它也可能不是这样。我们可以证明某些东西是或不是为什么"为什么"但它并不是唯一的证明。