“多对多”表中的主键

Lec*_*cko 1 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()
); 
Run Code Online (Sandbox Code Playgroud)

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

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

DBMS 是 PostgreSQL

Gor*_*off 6

这是一个“困难”的问题,因为双方都有很好的论据。我倾向于在我使用的所有表中放入自动递增的 ID。随着时间的推移,我发现这只是对开发过程有所帮助,我不必考虑它们是否有必要。

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

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

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

有些数据库实际上是根据主键来存储数据的。因此,当您执行插入操作时,必须在页面上移动数据以容纳新值。Postgres不是这些数据库之一。它像对待任何其他索引一样对待主键索引。换句话说,您不会通过将另外一列声明为主键而招致“额外”的工作。

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