Database design 你能有两个外键而没有主键吗?

Database design 你能有两个外键而没有主键吗?,database-design,relational-database,Database Design,Relational Database,我有一个简单的数据库,我正在两个表之间建立关系。所以我有第三个表,它们是链接的。第三个表是否需要主键?因为我所需要的只是将这两个表链接在一起,并为其他内容添加一列。您所描述的这种表有时被称为a。您将在要加入的列之间创建一个主键,这既是为了唯一性,也是因为它更有可能被索引以获得更好的性能。您所描述的是一个连接表。 是的,您可以在不使用主键的情况下创建一个(或者,另一个选项是复合主键-使两个引用成为唯一的对,并将其用作唯一的标识键-但即使这样也不是必需的(注意:仅仅因为它“不必”并不意味着它不是“良

我有一个简单的数据库,我正在两个表之间建立关系。所以我有第三个表,它们是链接的。第三个表是否需要主键?因为我所需要的只是将这两个表链接在一起,并为其他内容添加一列。

您所描述的这种表有时被称为a。您将在要加入的列之间创建一个主键,这既是为了唯一性,也是因为它更有可能被索引以获得更好的性能。

您所描述的是一个连接表。 是的,您可以在不使用主键的情况下创建一个(或者,另一个选项是复合主键-使两个引用成为唯一的对,并将其用作唯一的标识键-但即使这样也不是必需的(注意:仅仅因为它“不必”并不意味着它不是“良好实践”;通常情况下,将几行内容完全相同不是一个好主意)


使用这些术语,您应该能够找到实现所需的答案。

您必须有一个主键,但是两个外键可以构成一个复合主键。您通常不需要“有一个主键”,但您应该有一个!(@Lyuben-Todorov)我不同意,事实上这是一个非常有趣的争论@除非我们属于这些特殊情况,这是英语语义学。他们说你“应该”总是,你说你“必须”。有可能没有,这意味着你不“必须”。@DRobinson没有主键你不能保证1NF,因此你可以创建一个表,但不能创建一个关系。当然,外键是单独唯一的(因为它们应该是各自表中的主键),但是跨这两列的唯一性约束意味着您的联接表中没有重复的行。这个表将火车路线与运行它们的公司联接起来。本表格;我们假设显示每个公司的比例以及他们运营的列车数量。例如,A路——由Compax运营,运营50%的列车。如果你看这个关系,你当然应该有一个键,除非你想允许重复行。出于数据完整性和简单易用性的合理考虑,允许表中存在重复行通常不是一个好主意!唯一性约束只是键约束的另一个名称(假设有问题的列不可为null,因为否则唯一性就不一定是可执行的)。声明由组成两个外键的列组成的主键通常对您有利。它将强化唯一性。这将导致建立一个索引,可能会加快三向联接的速度。好吧,我在编辑我的文章时说,跨联接列的主键是标准做法。