在2NF中,不允许有partial dependency
,即任何非素数属性不应该依赖于主键的子集(不包括它本身,否则它将是full functional dependency
)。得到它了。但为什么?我们对部分依赖有什么问题?如果我们按原样保留它会破坏什么协议?我在互联网上搜索但没有找到任何参考资料。同样适用于BCNF和3NF。
答案 0 :(得分:1)
威廉·肯特的"A Simple Guide to Five Normal Forms in Relational Database Theory"是一个了解的好消息来源。以下是他如何通过部分依赖来描述问题。
考虑以下库存记录:
--------------------------------------------------- | PART | WAREHOUSE | QUANTITY | WAREHOUSE-ADDRESS | ====================-------------------------------
这里的钥匙一起由PART和WAREHOUSE字段组成,但WAREHOUSE-ADDRESS仅仅是关于WAREHOUSE的事实。这种设计的基本问题是:
- 仓库地址在每个记录中重复,该记录涉及存储在该仓库中的部件。
- 如果仓库的地址发生变化,则必须更新引用该仓库中存储的零件的每条记录。
- 由于冗余,数据可能会变得不一致,不同的记录显示同一仓库的不同地址。
- 如果在某个时间点仓库中没有存储零件,则可能没有记录来保存仓库的地址。
顺便说一句,你说,“任何非素数属性都不应该依赖于主键的子集”;你应该更多地说“任何非主要属性不应该依赖于任何候选键”的子集。关于关系理论的大多数文章和书籍通过假设只有一个候选键来简化他们的解释。但是,正常形式是根据每个候选键定义的。