在2NF中不允许有部分依赖,即任何非主属性不应该依赖于主键的子集(不包括其自身,否则将是完全功能依赖)。
但是为什么呢?
部分依赖有什么问题?
如果我们保持原样,会破坏什么协议?
William Kent 的 “关系数据库理论中五种范式的简单指南” 是一个很好的了解来源。以下是他如何描述部分依赖的问题。
考虑以下库存记录:
------------------------------------------------- -- |部分|仓库 |数量 |仓库地址| ====================-------------------------------------------- -
这里的键由 PART 和 WAREHOUSE 字段一起组成,但 WAREHOUSE-ADDRESS 是关于 WAREHOUSE 的事实。这种设计的基本问题是:
- 仓库地址在引用该仓库中存储的零件的每条记录中都会重复。
- 如果仓库地址发生变化,则必须更新涉及该仓库中存储的零件的每条记录。
- 由于冗余,数据可能会变得不一致,同一仓库的不同记录显示不同的地址。
- 如果在某个时间点仓库中没有存储零件,则可能没有记录来保存仓库地址。
顺便说一句,您说过“任何非素数属性不应依赖于主键的子集”;你应该说过更像“任何非素数属性不应该依赖于任何候选键的子集”。大多数有关关系理论的文章和书籍都通过假设只有一个候选键来简化其解释。但范式是根据“每个”候选键定义的。