sql - 2nf 第二范式困难练习

标签 sql database relational-database normalization

我有 R(A,B,C,D) 和 AB 主键和AD --> C

我认为它在 2nf 中,因为你不能用 AB 的子集确定 C 来自 wiki “如果表在 1NF 中并且没有非主要属性依赖于表的任何候选键的任何适当子集,则该表在 2NF 中”

但是很多人说是在1nf中因为定义 “在 2NF 中,如果它在 1NF 中并且表的每个非主要属性都依赖于每个候选键的整体” 所以 AD 不是整个主键,而只是另一个属性不是质数的一部分

如果你也可以放一些与维基百科不同的引用资料,这样我就可以证明我的论文是否真的正确

最佳答案

您声明 AB 是给定关系 R 的主键。要实现这一点,除了 AD->C 之外,还必须至少有一个函数依赖。

为了解释 2NF,我假设缺少的 FD 是 B->D。所以我们有 R(A,B,C,D) 与 FD 的关系:

AD->C
B->D

那么我们的主键是AB。现在简单来说,2NF 处理部分依赖,即当属性依赖于主键的一部分时。 (所以如果我们有一个主键,它只是一个属性,那么关系 R 已经在 2NF 中了!)

正式地:

给定关系R的函数依赖X->A,其中:

  1. XR
  2. 的一组 属性
  3. A 是不在 X
  4. 中的非素数属性

然后在 2NF 中,X 应该是任何 key 的真子集。

回到我们的例子。主键是 AB。所以主要属性是AB。非主要属性是 CD

让我们考虑第一个 FD,AD->C

这里的 C 是一个非主要属性。为了违反 2NF 条件,AD 应该是主键 AB 的真子集。 AD 不是 AB 的真子集,因此不违反 2NF 条件。

我们看下一个FD,B->D

这里 D 是一个非主属性,B 是主键 AB 的真子集,因此它违反了 2NF 条件。

因此关系 R 不符合第二范式。

另一方面,如果 R 的 FD 集是:

AD->C
AB->D

我们的主键仍然是 AB 但现在关系 R 是第二范式。

关于sql - 2nf 第二范式困难练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35661394/

相关文章:

sql - 如何从 SQL 结果集中删除空白行

mysql - 删除记录时 SQL 触发器不起作用

mongodb - 从 Entity Framework 移植到 MongoDB

mysql - 构建关注者/关注 MySQL 数据库的最佳实践

mysql - 用户反馈系统的正确数据库模型(一个有趣的案例)

MySQL同一个表内的关系?

sql - 捕获前 5 行并组合其余的 SQL Server

php - 独特值的 SQL 查询(条目)

c++ - 选择哪个选项在 C++ 中使用 sql

mysql - 不能在 mysql 中创建表,因为它们都相互依赖?