将UNF标准化为1NF

时间:2015-10-07 19:48:05

标签: database normalization database-normalization

当使用多值属性规范化关系时,我们将其作为与主键字段的新关系和来自多值属性的值进行分解。

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

如果我们使用与新主键相同的旧主键,因为我们使用多值属性中的值重复其中的值,我们如何在此处为主键字段设置唯一值?

我有一个包含customer_names的表,他们的爱好等等。有些人有超过1个爱好,所以现在它是一个多值属性。现在,即使我只与customer_name&创建一个新关系一次有一个爱好,我怎么能添加人们的细节说谁有3个爱好?

2 个答案:

答案 0 :(得分:2)

为新属性创建查找表时,不要在查找表中重复该值。通常你会以IDENTITY列的形式添加一个人工PK。

例如:您有一个包含大量地址的表。有一个共同城市的地址很多。

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

编辑:在评论中描述的方案中,您可以使用HobbiesCustomerID创建HobbyName表格。

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

编辑2:正如Beth和我在评论中提到的那样,你似乎想要多对多的关系。

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

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

就是这样。

答案 1 :(得分:1)

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

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

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