【问题标题】:Normalization UNF to 1NF将 UNF 归一化为 1NF
【发布时间】:2016-01-05 05:05:19
【问题描述】:

当规范化具有多值属性的关系时,我们将其分解为具有主键字段和来自多值属性的值的新关系。

我的问题是,新创建的属性的主键是什么?

如果我们使用与新主键相同的旧主键,由于我们使用多值属性中的值重复那里的值,那么这里的主键字段如何具有唯一值?

我有一张桌子,上面有客户姓名、他们的爱好等。有些人有不止一个爱好,所以现在它是一个多值属性。现在,即使我一次只使用 customer_name 和一个爱好创建一个新关系,我如何添加说谁有 3 个爱好的人的详细信息?

【问题讨论】:

    标签: database database-normalization


    【解决方案1】:

    从纯规范化的角度来看,新关系的键将是原始关系的键和新的单值属性的组合。

    例如,如果您有一个关系 (Person PK, Name, Hobbies),其中 Hobbies 是一个列表,您可以将其规范化为 (Person PK, Name)(Person PK, Hobby PK)

    代理键的引入是一个单独的问题,虽然它在实践中经常在规范化时完成,但它不是概念的一部分。爱好名称不适合用作键:大多数情况下,它们不是唯一的 - 存在同义词、语言和语法变化。它们也可能会改变而不是紧凑。因此,代理键可能是个好主意。

    【讨论】:

      【解决方案2】:

      当您为新属性创建查找表时,您不会重复查找表中的值。而且通常您会以 IDENTITY 列的形式添加人工 PK。

      例如:您有一张包含一堆地址的表格。同一个城市有很多地址。

      您决定通过创建城市表来规范化。您只需将给定城市添加到 City 表一次。不是每个地址一次。

      编辑:在您评论中描述的场景中,您可以使用CustomerIDHobbyName 创建一个Hobbies 表。

      CustomerID 将是引用 Customers 表中的主键的外键。

      编辑 2:正如 Beth 和我在 cmets 中提到的,您似乎想要一个多对多的关系。

      创建一个Hobbies 表,每个唯一爱好只有一行。如果两个或更多客户有相同的爱好,您仍然只在表格中列出该爱好一次。使用 Identity 列创建 HobbyID 作为主键。

      然后创建一个CustomerHobby 表。它有CustomerIDHobbyID。两者都是分别引用Customers 表和Hobbies 表的主键的外键。

      就是这样。

      【讨论】:

      • 这里我想知道的情况是我有一张表,上面有customer_name他们的爱好等等。有些人有超过1个爱好,所以现在它是一个多值属性。现在,即使我一次只使用 customer_name 和一个爱好创建一个新关系,我怎么能添加说谁有 3 个爱好的人的详细信息!请帮帮我
      • 可以多人拥有相同的爱好吗?如果是这样,那么您可能希望使用桥接表创建多对多关系。
      • 是的,不止一个人可以拥有相同的爱好。但是我想把人的爱好具体记录下来。如果我把爱好编码在另一个表中是否可以在规范化过程中可以接受我刚刚学习了规范化,如果它不可接受,请原谅。
      • 您需要一张 hobby 表和一张 customerHobby 表来跟踪每个客户的所有爱好和所有爱好
      • 我可以向数据库添加新属性吗?完全是新字段?
      猜你喜欢
      • 2018-03-30
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 2016-01-06
      • 1970-01-01
      相关资源
      最近更新 更多