【问题标题】:SQL Normalization UNL 1NF 2NF 3NFSQL 规范化 UNL 1NF 2NF 3NF
【发布时间】:2016-12-01 23:03:02
【问题描述】:

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

这是一张桌子的图片:

这是我可能缺少 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 的外观如何?

【问题讨论】:

  • 关系的每个正常形式都必须指明键。
  • use text, not images/links, for text (including code, tables & ERDs)。使用链接/图像仅是为了方便补充文本和/或无法在文本中给出的内容。让您的帖子自成一体。
  • 标准化到更高的 NF 使用 FD。你的是什么?为什么? PS 显示并证明您的工作步骤,否则您希望我们重做而不是检查它。 (就像在每个人的整个学术教育中一样。)也给your class's definition of "UNF" & "1NF"--没有固定的含义。 (还要定义你的“UNF”符号,如果你的起始表不是关系的表示,那么定义如何解释它。)

标签: sql database-normalization


【解决方案1】:

前两种形式我可以提供帮助,我不能 100% 确定你的情况是 3NF。

这是我的解释。

1NF

  • 表的字段必须包含原子值。
  • 不能有重复组

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

2NF

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

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

3NF

3NF的定义是:

  • 第二范式
  • 没有传递函数依赖

一个传递函数依赖被描述为:A函数依赖B,B函数依赖C。所以A通过B传递依赖C。

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

我没有在您的表中看到传递依赖关系,我很想知道是否有其他人可以发现一个。我在想,如果您已将其作为作业分配,那么他们必须寻找第三种范式,或者可能没有! :)

【讨论】:

  • 您是否注意到标记依赖于产品类别?也就是说,园艺工具 (GT) 都有 30% 的加价,灌木 (SB) 有 50%,肥料 (FT) 有 25%,洒水器 (SP) 有 40%。
  • 虽然目前的表数据没有任何重复的行,但我对 1NF 的理解是必须明确定义该表以不允许 i> 将来要添加的重复行。在 SQL 中,这可以通过声明 UNIQUEPRIMARY KEY 约束来实现。在这种情况下,产品 ID 似乎非常适合。
  • 是的,OP 已将标记移入包含产品类的表中。我不确定您的评论是什么意思,您是说存在 3NF 依赖关系吗?
  • 我在 1NF 中看不到任何防止重复行的要求。这是来自维基百科的定义:“当且仅当每个属性的域仅包含原子(不可分割)值,并且每个属性的值仅包含来自该域的单个值时,关系才处于第一范式。”
  • 在您的 3NF 描述中,您描述了表之间的依赖关系。关系理论中没有这样的东西。传递依赖(以及一般的函数依赖)是指关系的之间的依赖。
【解决方案2】:

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

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

我个人会将其保存在 2NF 中并在服务器端代码(c# 或 java)中处理。

【讨论】:

    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2013-05-11
    • 1970-01-01
    • 2017-01-18
    • 2011-04-25
    相关资源
    最近更新 更多