标准化 UNF 到 1NF

Normalization UNF to 1NF

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

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

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

我和customer_names有一个table,他们的爱好等等。有些人有不止一种爱好,所以现在它是一个多值属性。现在,即使我一次只与 customer_name 和一个爱好建立新关系,我如何添加据说有 3 个爱好的人的详细信息?

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

例如:您有一个 table 和一堆地址。有很多地址有一个共同的城市。

您决定通过创建城市 table 来实现正常化。您只能将给定的城市添加到城市 table 一次。不是每个地址一次。

编辑:在您评论中描述的场景中,您可以使用 CustomerIDHobbyName.

创建一个 Hobbies table

CustomerID 将是引用 Customers table.

中的主键的外键

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

创建一个 Hobbies table,每个独特的爱好只有一行。如果两个或更多客户有相同的兴趣爱好,您仍然只在 table 中列出一次兴趣爱好。使用标识列创建一个 HobbyID 作为主键。

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

就是这样。

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

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

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