我在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
答案 0 :(得分:4)
代理键不会保护您添加(f_id1,f_id2)的多个实例,因此您肯定应该有一个唯一的约束或主键。代理键的目的是什么?在你的场景中?
答案 1 :(得分:4)
这是一个很难的"从某种意义上说,双方都有很好的争论。我偏向于在我使用的所有表中放入自动递增的ID。随着时间的推移,我发现这对开发过程有帮助,我不必考虑是否有必要。
这样做的一个重要原因是对表的外键引用只能使用一列。
在多对多联结表(又名"关联表")中,这可能不是必需的:
not null
。某些数据库实际上存储基于主键的数据。因此,当您执行插入操作时,必须在页面上移动数据以适应新值。 Postgres 不其中一个数据库。它像任何其他索引一样处理主键索引。换句话说,你不会招致"额外的"通过将另外一列声明为主键来工作。
我的结论是,复合主键很好,即使我可能有一个具有单独约束的自动递增主键。复合主键占用的空间较少,因此可能比自动递增的ID更有效。但是,如果此表有可能用于外键关系,则添加另一个id字段。
答案 2 :(得分:1)
是的,这实际上是人们常做的事情,这个密钥被称为代理密钥..我不完全确定PostgreSQL,但在MySQL中使用代理密钥你可以从用户界面删除/编辑记录。此外,这允许数据库比单个列更快地查询单个键列。希望它有帮助..