SQL规范化UNL 1NF 2NF 3NF

时间:2016-12-01 23:03:03

标签: sql database-normalization

对于学校的作业,我们将为我们提供的表格绘制UNL,1NF,2NF,3NF关系。我想我能够完成UNL,1NF,2NF,但我不知道如何为3NF做到这一点。

这是表格的图片:

enter image description here

以下是我可能的解决方案,缺少3NF。

UNF关系

ProductReport[ProductC, Classif, Markup(ProductID, Desc, Cost)]

1NF关系

ProductReport[ProductC, Classif, Markup]

ProductDetails [ProductC, ProductID, Desc, Cost]

2NF关系

ProductReport[ProductC, Classif, Markup]
Product [ProductID, Desc]
ProductDetails [ProductC, ProductID,  Cost]

3NF关系

所以我的问题是,我的UNF,1NF,2NF是否正确?如果是的话,3NF会怎么样?

2 个答案:

答案 0 :(得分:0)

我可以帮助解决前两种形式,在你的情况下,我对3NF并不是100%肯定。

这是我的解释。

1NF

  • 表的字段必须包含原子值。
  • 可以没有重复的小组

您的表已经在1NF中,因为每个字段只包含单个值(即使它们是多个单词字符串),并且没有重复组,因为每个字段都存储不同的属性;例如如果产品在同一行重复进行一次分类

2NF

  • 表格为第一范式
  • 所有非关键属性都完全依赖于主键

如您所知,我们需要从产品中分离分类和标记以及从成本中分离产品描述;最终的charge将是最终报告查询中的计算字段。

3NF

3NF的定义是:

  • 处于第二范式
  • 没有传递功能依赖

传递函数依赖性描述为:A在功能上依赖于B,B在功能上依赖于C.因此A通过B传递依赖于C.

所以我们正在寻找同一个表中字段之间的依赖关系,而不是像我刚才所说的那样在表格之间寻找依赖关系(感谢reaanb指出这一点)。

我没有在你的表中看到传递依赖,我有兴趣知道是否有其他人可以发现一个。我想如果你被赋予这个作为一项任务,他们必须要有第三种正常形式,或者可能不是! :)

答案 1 :(得分:0)

标记和费用之间存在传递依赖关系。必须将这两个字段放在单独的表中才能通过3NF。

3NF的一个更常见的示例是邮政编码和城市。如果用户更改城市值,则会直接影响邮政编码值。

我个人将其保留在2NF中,并通过服务器端代码(C#或Java)进行处理。