当使用多值属性规范化关系时,我们将其作为与主键字段的新关系和来自多值属性的值进行分解。
我遇到的问题是,新创建的属性的主键是什么?
如果我们使用与新主键相同的旧主键,因为我们使用多值属性中的值重复其中的值,我们如何在此处为主键字段设置唯一值?
我有一个包含customer_names的表,他们的爱好等等。有些人有超过1个爱好,所以现在它是一个多值属性。现在,即使我只与customer_name&创建一个新关系一次有一个爱好,我怎么能添加人们的细节说谁有3个爱好?
答案 0 :(得分:2)
为新属性创建查找表时,不要在查找表中重复该值。通常你会以IDENTITY列的形式添加一个人工PK。
例如:您有一个包含大量地址的表。有一个共同城市的地址很多。
您决定通过创建城市表来规范化。您只需将给定城市添加到城市表中。每个地址不一次。
编辑:在评论中描述的方案中,您可以使用Hobbies
和CustomerID
创建HobbyName
表格。
CustomerID
将是引用Customers
表中主键的外键。
编辑2:正如Beth和我在评论中提到的那样,你似乎想要多对多的关系。
创建一个Hobbies
表,每个唯一的Hobby只有一行。如果两个或多个客户拥有相同的爱好,您仍然只会在表格中列出一次爱好。使用“标识”列创建HobbyID
作为主键。
然后创建一个CustomerHobby
表。它有CustomerID
和HobbyID
。两者都是外键,分别引用Customers
表和Hobbies
表的主键。
就是这样。
答案 1 :(得分:1)
从纯粹的规范化角度来看,新关系的关键是原始关系的密钥和新的单值属性的组合。
例如,如果您有一个关系(Person PK, Name, Hobbies)
,其中Hobbies是一个列表,您可以将其标准化为(Person PK, Name)
和(Person PK, Hobby PK)
。
代理密钥的引入是一个单独的问题,虽然它通常在规范化的实践中完成,但它不是概念的一部分。爱好名称不适合用作关键词:大多数情况下,它们并不是唯一的 - 有同义词,语言和语法变体。他们也可能会改变而不是紧凑。因此,代理键可能是一个好主意。