【问题标题】:Database normalization 2NF and 3NF数据库规范化 2NF 和 3NF
【发布时间】:2018-04-10 18:10:14
【问题描述】:

假设关系Appliance(model, year, price, manufacturer, color){model, year} 为键并遵循 FD:

model -> manufacturer
model, year -> price
manufacturer -> color

找出 2NF 和 3NF。

我的解决方案是这样的: 由于model -> manufacturer由于部分依赖而违反了2NF,我将Appliance分解如下:

R1(model, manufacturer)
R2(model, year, price)
R3(manufacturer, color)

同样,model -> manufacturermanufacturer -> color 因为传递依赖违反了 3NF,所以我将 Appliance 分解如下:

R1(model, manufacturer)
R2(model, year, price)
R3(model, color)

我的问题是我的标准化有什么问题?

【问题讨论】:

  • {model, year} 是一个 CK,所以它在功能上决定了每个属性。所以提到 {model, year} -> price 没有意义。问题 FD 也来自所有持有的非平凡 FD,但您只列出了 一些 持有的非平凡 FD。此外,不好的不是部分和传递的 FD,而是 某些 部分和传递的 FD 不好。根据特定定义,坏的只是坏的。所以引用你正在使用的定义。 PS 我们没有通过 2NF 得到最好的 3NF 设计。 (尽管有些教科书是这么说的。)

标签: database-normalization 3nf


【解决方案1】:

您对 2NF 的规范化是正确的。您可能想更深入地思考一个关系是否违反了 2NF 或 3NF,或者一个函数依赖是否违反了 2NF 或 3NF。你两个都说。

在您的 2NF 分解中,R1、R2 和 R3 在 5NF 中。 (因此,根据定义,它们也属于 3NF 和 2NF。)

对于 3NF,您丢失了 FD manufacturer -> color。所以这是错误的。

在现实世界中,对诸如“设备”之类的关系进行规范化可能会导致不止一个 5NF 分解。

【讨论】:

  • 在我的解决方案中,R3 在 2NF 和 3NF 方面有所不同。另外,我的意思是说 FD 违反了 2NF 和 3NF。
  • @NimitPatel:你是对的。我误读了您对 3NF 的分解。但是这种分解是错误的;你失去了 FD 制造商 -> 颜色。
  • 我同意我的分解是错误的,3NF 应该保留 FD。那么,R1(model, manufacturer, color)R2(model, year, price) 会在 3NF 中吗?谢谢!
  • @NimitPatel:不,这会在 R1 中留下传递依赖或部分密钥依赖,这取决于您决定密钥应该是什么。您对 2NF 的分解对于 2NF 和 3NF 都是正确的。 (因为 R1、R2 和 R3 都在 5NF 中。)
猜你喜欢
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2010-12-15
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多