标准化 UNF 到 1NF
Normalization UNF to 1NF
在规范化具有多值属性的关系时,我们将其分解为具有主键字段和多值属性值的新关系。
我的问题是,新创建的属性的主键是什么?
如果我们使用与新主键相同的旧主键,因为我们用多值属性中的值重复那里的值,我们怎么能在这里的主键字段具有唯一值?
我和customer_names有一个table,他们的爱好等等。有些人有不止一种爱好,所以现在它是一个多值属性。现在,即使我一次只与 customer_name 和一个爱好建立新关系,我如何添加据说有 3 个爱好的人的详细信息?
当您为新属性创建查找 table 时,您不会在查找 table 中重复该值。通常您会以 IDENTITY 列的形式添加人工 PK。
例如:您有一个 table 和一堆地址。有很多地址有一个共同的城市。
您决定通过创建城市 table 来实现正常化。您只能将给定的城市添加到城市 table 一次。不是每个地址一次。
编辑:在您评论中描述的场景中,您可以使用 CustomerID
和 HobbyName
.
创建一个 Hobbies
table
CustomerID
将是引用 Customers
table.
中的主键的外键
编辑 2:正如 Beth 和我在评论中提到的,您似乎想要多对多关系。
创建一个 Hobbies
table,每个独特的爱好只有一行。如果两个或更多客户有相同的兴趣爱好,您仍然只在 table 中列出一次兴趣爱好。使用标识列创建一个 HobbyID
作为主键。
然后创建一个CustomerHobby
table。它有 CustomerID
和 HobbyID
。两者都是外键,分别引用 Customers
table 和 Hobbies
table 的主键。
就是这样。
从纯规范化的角度来看,新关系的键将是原始关系键和新的单值属性的组合。
例如,如果您有一个关系 (Person PK, Name, Hobbies)
,其中爱好是一个列表,您可以将其规范化为 (Person PK, Name)
和 (Person PK, Hobby PK)
。
代理键的引入是一个单独的问题,虽然在规范化实践中经常这样做,但它不是概念的一部分。爱好名称不适合用作关键字:大多数情况下,它们不是唯一的 - 存在同义词、语言和语法变体。它们也可能会发生变化而不是紧凑。因此,代理键可能是个好主意。
在规范化具有多值属性的关系时,我们将其分解为具有主键字段和多值属性值的新关系。
我的问题是,新创建的属性的主键是什么?
如果我们使用与新主键相同的旧主键,因为我们用多值属性中的值重复那里的值,我们怎么能在这里的主键字段具有唯一值?
我和customer_names有一个table,他们的爱好等等。有些人有不止一种爱好,所以现在它是一个多值属性。现在,即使我一次只与 customer_name 和一个爱好建立新关系,我如何添加据说有 3 个爱好的人的详细信息?
当您为新属性创建查找 table 时,您不会在查找 table 中重复该值。通常您会以 IDENTITY 列的形式添加人工 PK。
例如:您有一个 table 和一堆地址。有很多地址有一个共同的城市。
您决定通过创建城市 table 来实现正常化。您只能将给定的城市添加到城市 table 一次。不是每个地址一次。
编辑:在您评论中描述的场景中,您可以使用 CustomerID
和 HobbyName
.
Hobbies
table
CustomerID
将是引用 Customers
table.
编辑 2:正如 Beth 和我在评论中提到的,您似乎想要多对多关系。
创建一个 Hobbies
table,每个独特的爱好只有一行。如果两个或更多客户有相同的兴趣爱好,您仍然只在 table 中列出一次兴趣爱好。使用标识列创建一个 HobbyID
作为主键。
然后创建一个CustomerHobby
table。它有 CustomerID
和 HobbyID
。两者都是外键,分别引用 Customers
table 和 Hobbies
table 的主键。
就是这样。
从纯规范化的角度来看,新关系的键将是原始关系键和新的单值属性的组合。
例如,如果您有一个关系 (Person PK, Name, Hobbies)
,其中爱好是一个列表,您可以将其规范化为 (Person PK, Name)
和 (Person PK, Hobby PK)
。
代理键的引入是一个单独的问题,虽然在规范化实践中经常这样做,但它不是概念的一部分。爱好名称不适合用作关键字:大多数情况下,它们不是唯一的 - 存在同义词、语言和语法变体。它们也可能会发生变化而不是紧凑。因此,代理键可能是个好主意。