database - 学习数据库归一化,对2NF一头雾水

标签 database normalization functional-dependencies

我在 youtube 上看这个关于规范化的视频,我不得不说我现在很困惑,我可能在视频中有错误,即使它有 25 个喜欢,只有 1 个不喜欢。

Normalization

特别是关于可以在 5 分钟标记处找到的 2NF 部分。

作者说“作业描述”列取决于作业 ID 列...但是对于相同的作业 ID 却有不同的作业描述。然后,他将该表“规范化”为 2NF,方法是将其分成两个表……其中一个仅包含作业 ID 和作业描述。而且这个表连 1NF(非唯一主键)都不是,怎么可能是 2NF?

谁能告诉我这个视频关于 2NF 是正确的还是不正确的?

最佳答案

从关系的角度来看,该视频充其量只是马虎和粗心。它的某些部分完全是错误的,包括您引用的部分。不要再看“数据库规范化大师”的视频了。

要使关系符合 2NF,它必须

  • 在 1NF 中,并且
  • 没有部分键依赖。

如果属性依赖于任何候选键的一部分,则存在部分键依赖,并且该关系不在 2NF 中。

视频试图说明的一点是,如果主键是单列,则关系保证为 2NF。但是看看这张表(来自 Wikipedia entry for 2NF )。

Employees' Skills
--
Employee    Skill           Current Work Location
Jones       Typing          114 Main Street
Jones       Shorthand       114 Main Street
Jones       Whittling       114 Main Street
Bravo       Light Cleaning  73 Industrial Way
Ellis       Alchemy         73 Industrial Way
Ellis       Flying          73 Industrial Way
Harrison    Light Cleaning  73 Industrial Way

这个关系只有一个候选键,{Employee, Skill}。但是 Employee 和 Current Work Location 之间存在部分关键依赖关系。给定 Employee 的任何值,我们会为 Current Work Location 找到一个且只有一个值。

将主键更改为代理 ID 号不会改变这种情况,尽管视频暗示它会。

Employees' Skills
--
ID  Employee    Skill           Current Work Location
1   Jones       Typing          114 Main Street
2   Jones       Shorthand       114 Main Street
3   Jones       Whittling       114 Main Street
4   Bravo       Light Cleaning  73 Industrial Way
5   Ellis       Alchemy         73 Industrial Way
6   Ellis       Flying          73 Industrial Way
7   Harrison    Light Cleaning  73 Industrial Way

主键是单列,他们说这保证了这种关系是 2NF。但事实并非如此。视频制作者忽略了一个事实,即大多数表有多个候选键,并且规范化考虑了每个候选键,而不仅仅是称为主键的“特殊”候选键.

这个视频还有很多其他问题 -- 太多以至于我没有看完。人生苦短,不能再浪费一分钟了。

关于database - 学习数据库归一化,对2NF一头雾水,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15166890/

相关文章:

python - .CSV 文件字典的数据清理

sql - 一个数据库用于一个客户或一个用于所有客户

machine-learning - 如果我对训练数据执行数据预处理,是否有必要对测试数据执行相同的数据预处理?

mysql - 我们如何处理在表的所有记录中具有相同值的列?

machine-learning - 在训练/验证/测试中使用标准化或归一化参数

haskell - 在 Haskell 中表达具有函数依赖关系的类型类关系

数据库设计冗余功能依赖(FD)

database-design - 什么是规范的覆盖,关闭和无关属性?

Android Studio 将数据库填充到 RecyclerVIew

mysql - 按周显示时间戳数据