“多对多”表中的主键

时间:2014-08-10 12:22:12

标签: sql postgresql

我在SQL数据库中有一个提供“多对多”连接的表。

该表包含两个表的id和一些包含有关连接的附加信息的字段。

CREATE TABLE SomeTable (
  f_id1 INTEGER NOT NULL,
  f_id2 INTEGER NOT NULL,
  additional_info text NOT NULL,
  ts timestamp NULL DEFAULT now()
); 

该表预计将包含10 000 - 100 000个条目。

如何设计主键更好?我应该创建一个额外的“id”字段,还是从两个id创建一个复杂的主键?

DBMS是PostgreSQL

3 个答案:

答案 0 :(得分:4)

代理键不会保护您添加(f_id1,f_id2)的多个实例,因此您肯定应该有一个唯一的约束或主键。代理键的目的是什么?在你的场景中?

答案 1 :(得分:4)

这是一个很难的"从某种意义上说,双方都有很好的争论。我偏向于在我使用的所有表中放入自动递增的ID。随着时间的推移,我发现这对开发过程有帮助,我不必考虑是否有必要。

这样做的一个重要原因是对表的外键引用只能使用一列。

在多对多联结表(又名"关联表")中,这可能不是必需的:

  • 您不太可能将具有外键关系的表添加到联结表。
  • 无论如何,您都希望在列上获得唯一索引。
  • 无论如何,他们可能会被宣布为not null

某些数据库实际上存储基于主键的数据。因此,当您执行插入操作时,必须在页面上移动数据以适应新值。 Postgres 其中一个数据库。它像任何其他索引一样处理主键索引。换句话说,你不会招致"额外的"通过将另外一列声明为主键来工作。

我的结论是,复合主键很好,即使我可能有一个具有单独约束的自动递增主键。复合主键占用的空间较少,因此可能比自动递增的ID更有效。但是,如果此表有可能用于外键关系,则添加另一个id字段。

答案 2 :(得分:1)

是的,这实际上是人们常做的事情,这个密钥被称为代理密钥..我不完全确定PostgreSQL,但在MySQL中使用代理密钥你可以从用户界面删除/编辑记录。此外,这允许数据库比单个列更快地查询单个键列。希望它有帮助..