Database 确定关系是3NF还是2NF

Database 确定关系是3NF还是2NF,database,relational-database,database-normalization,3nf,Database,Relational Database,Database Normalization,3nf,来自《数据库管理系统》一书:给定关系SNLRWH(每个字母表示一个属性)和以下功能相关性: S->SNLRWH(S为主键) R->W 我的尝试: 首先,它不是3NF:对于第二个FD,R既不包含W,R也不包含键,W也不是键的一部分 其次,它是/不是2NF。如果我们检查第二个FD,W依赖于R,而R又不是键的一部分。卡住了 2NF与部分密钥依赖性有关。为了使关系无法通过2NF测试,该关系必须至少有一个至少有两列的候选键 因为您的关系只有一个候选键,而该候选键只有一列,所以不可能有部分键依赖关系。

来自《数据库管理系统》一书:给定关系SNLRWH(每个字母表示一个属性)和以下功能相关性:

  • S->SNLRWH(S为主键)
  • R->W
我的尝试:

  • 首先,它不是3NF:对于第二个FD,R既不包含W,R也不包含键,W也不是键的一部分
  • 其次,它是/不是2NF。如果我们检查第二个FD,W依赖于R,而R又不是键的一部分。卡住了
2NF与部分密钥依赖性有关。为了使关系无法通过2NF测试,该关系必须至少有一个至少有两列的候选键


因为您的关系只有一个候选键,而该候选键只有一列,所以不可能有部分键依赖关系。它通过了2NF测试。

2NF被违反,如果候选键的某个适当子集在某个(非平凡)依赖项的左侧显示为行列式。问问自己是否有任何行列式是候选键的子集

通常,只有当一个关系有一个复合键(一个具有多个属性的键)时,才会违反2NF。从技术上讲,只有简单键(单属性键)的关系可能违反2NF,如果该集合为空(∅) 碰巧是一个决定因素。这种情况相当不寻常,很少值得考虑,因为它们是如此明显的“错误”。为了完整性,这里有一个有趣的特殊情况的例子。在下面的关系中,周长和直径都是候选键。违反2NF的依赖关系是∅ -> 圆周率,圆周与直径之比


A-ve将非常苛刻;-)这仅适用于没有FD{}->{A}的情况,即没有每行都包含相同A值的列,因此每个FD{B}->{A}都已满。(根据nvogel的回答)没有行列式是候选密钥的适当子集的子集,一个det等于一个候选密钥,而另一个det甚至不是子集。所以这个关系是2NF.@ToniAz{}->Pi,所以行列式{}是CK{percentral}和CK{Diameter}的适当超集。因此,Pi,一个非素数属性,在功能上部分依赖于每个ck。所以2NF被违反了。@philipxy,你是对的,但我猜ToniAz之前的评论是指他的例子,而不是我的。