Database design 为什么不应该';在ER模型中,关联是否具有主键属性?

Database design 为什么不应该';在ER模型中,关联是否具有主键属性?,database-design,Database Design,为什么在ER模型中,关联不应该具有主键属性 我知道,稍后,关联通常映射到数据库表,其主键由连接到此关联的两个(或多个)实体的外键构成 但从纯粹的ER建模角度来看,原因是什么?是否有?当允许关联表具有多个具有相同外键组合的行时,会出现问题。如果发生这种情况,那么对各种不同的属性值应用什么含义 有时候这就是你想要的。这可能是因为两个实体可能具有多个具有不同属性的同时关系。但这将是非常不寻常的 当数据库设计能够自然地对现实世界的关系进行建模时,尤其是当它能够自动地从结构上排除坏的或无意义的数据时,它的

为什么在ER模型中,关联不应该具有主键属性

我知道,稍后,关联通常映射到数据库表,其主键由连接到此关联的两个(或多个)实体的外键构成


但从纯粹的ER建模角度来看,原因是什么?是否有?

当允许关联表具有多个具有相同外键组合的行时,会出现问题。如果发生这种情况,那么对各种不同的属性值应用什么含义

有时候这就是你想要的。这可能是因为两个实体可能具有多个具有不同属性的同时关系。但这将是非常不寻常的


当数据库设计能够自然地对现实世界的关系进行建模时,尤其是当它能够自动地从结构上排除坏的或无意义的数据时,它的工作效果最好。

当允许关联表具有多个具有相同外键组合的行时,问题就出现了。如果发生这种情况,那么对各种不同的属性值应用什么含义

有时候这就是你想要的。这可能是因为两个实体可能具有多个具有不同属性的同时关系。但这将是非常不寻常的


数据库设计在自然地模拟现实世界的关系时效果最好,特别是当它能够自动地从结构上排除坏的或无意义的数据时。

我同意Jeffrey Whitledge的所有答案。此外:

您的问题与代理项的问题有关,代理项是为索引表(例如SQL Server标识列)而生成的。如果您想停留在“纯ER”建模领域,则应坚持使用候选键,例如由外键形成的复合键。如果您使用的是候选密钥,您可能不会像Whitledge先生所指出的那样从结构上排除坏的或无意义的数据。这适用于关联以及其他类型的实体

也就是说,候选密钥确实有一些实际优势,这取决于您工作的环境。例如,MS Access处理代理键比正确定义的复合键容易得多。在其他环境中,能够将对行的引用存储为32位int非常有用。事实上,我看过一些演示文稿,其中将代理键应用于所有实体被认为是“最佳实践”,这让事情走得有点远。关键是您确实从代理中获得了一些简单性。您可以将代理项与候选键上正确定义的唯一索引结合使用。旁注-使用标识列作为您创建的实体(如发票)的主键是有效的:在这种情况下,标识列实际上不是代理项


如果您的关联没有任何属性,那么无论您多么喜欢代理键,添加代理键都不会有任何好处。如果要将非外键属性添加到关系实体中,您可能会看到添加代理的一些好处,因为您可能需要选择关系本身。在这种情况下,您应该在外键上定义一个唯一的索引,除非您希望允许重复关系。

我同意Jeffrey Whitledge的所有答案。此外:

您的问题与代理项的问题有关,代理项是为索引表(例如SQL Server标识列)而生成的。如果您想停留在“纯ER”建模领域,则应坚持使用候选键,例如由外键形成的复合键。如果您使用的是候选密钥,您可能不会像Whitledge先生所指出的那样从结构上排除坏的或无意义的数据。这适用于关联以及其他类型的实体

也就是说,候选密钥确实有一些实际优势,这取决于您工作的环境。例如,MS Access处理代理键比正确定义的复合键容易得多。在其他环境中,能够将对行的引用存储为32位int非常有用。事实上,我看过一些演示文稿,其中将代理键应用于所有实体被认为是“最佳实践”,这让事情走得有点远。关键是您确实从代理中获得了一些简单性。您可以将代理项与候选键上正确定义的唯一索引结合使用。旁注-使用标识列作为您创建的实体(如发票)的主键是有效的:在这种情况下,标识列实际上不是代理项


如果您的关联没有任何属性,那么无论您多么喜欢代理键,添加代理键都不会有任何好处。如果要将非外键属性添加到关系实体中,您可能会看到添加代理的一些好处,因为您可能需要选择关系本身。在这种情况下,您应该在外键上定义一个唯一的索引,除非您希望允许重复关系。

谁说不应该?模型应该具有所需的尽可能多的属性和键,以表示正在建模的对象。每个表(或实体)应该至少有一个键。

谁说不应该?模型应该具有所需的尽可能多的属性和键,以表示正在建模的对象。每个表(或实体)至少应有一个键