了解功能依赖性

时间:2012-12-14 15:33:25

标签: database normalization functional-dependencies

我目前正在学习功能依赖,并且正在努力探索它们背后的概念。

说我有桌子:

客户

|-----------|--------------|------------|------------------|------------------|
|Cust-ID    | Cust-FName   |Cust-LName  |Cust-Email        |Cust-Pw           |
|-----------|--------------|------------|------------------|------------------|
|1          |John          |Smith       |jsmith@email.com  |srt6564sdgjhy55y  |
|2          |Adam          |Borneo      |adb@hotmail.com   |45657ythjdfgqAfd  |
-------------------------------------------------------------------------------

有两个候选键:cust-ID和cust-Email(只有一个电子邮件地址可能属于一个客户)。选择cust-ID作为P.K,唯一的功能依赖是:

{Cust-ID} -> {Cust-FName, Cust-LName, Cust-Email, Cust-Pw}

或者,我会绘制/代表两个候选键:

{Cust-ID} -> {Cust-FName, Cust-LName, Cust-Email, Cust-Pw}

{Cust-Email} -> {Cust-ID, Cust-FName, Cust-LName, Cust-Pw}

本能告诉我前者,但鉴于这是一个全新的话题,我会感激任何帮助!

2 个答案:

答案 0 :(得分:1)

功能依赖集始终是[候选]键的超集。换句话说, key 是一个功能依赖,其属性列表覆盖整个关系。因此,您列出的两个候选键也都是函数依赖项。

答案 1 :(得分:0)

两者

{Cust-ID} -> {Cust-FName, Cust-LName, Cust-Email, Cust-Pw}

{Cust-Email} -> {Cust-ID, Cust-FName, Cust-LName, Cust-Pw}

是您的案例中的功能依赖项。

功能依赖是这样的情况:每当你有两行对箭头左侧的列具有相同的值时,右边的列的值箭头的一面必须相等。如果您有两行具有相同的Cust-ID,则名称,电子邮件和密码列必须相同。如果您有两行具有相同的Cust-Email,那么(在您的示例中)名称,电子邮件和密码列必须相同。

如果您的表格不在第三范式,那么您可能在左侧有一个适当的密钥子集功能依赖。实际上,您根据功能依赖性定义了候选键和普通表单(2NF,3NF,BCNF)。

您可以在functional dependencies on our company blog上阅读更多内容。这是关于数据规范化的一系列帖子的第一部分。