我们应该使用序列还是身份作为主键?

The*_*ler 8 sql database db2 postgresql primary-key-design

我们正在创建一个包含 20 多个表的新数据库,我们的数据库支持:

  • 序列。
  • 标识列(始终生成为标识/序列)。

所以,问题是:我们应该使用序列还是恒等式?哪一个更好?团队似乎在这个问题上存在分歧,所以我想听听优点缺点,以帮助做出决定。

添加数据库详细信息:

  • 我们正在 IBM DB2 上创建新数据库,但我们需要确保它将与未来迁移到 PostgreSQL 的计划兼容。

Gor*_*off 4

您的问题是关于使用序列与身份(大概是“始终作为身份生成”列)。在 Postgres 中,这些将被声明为serial. 这些始终是单列中的某种数字。

从数据库性能角度来看,两者没有太大区别。一个重要的区别是,某些数据库会缓存标识列,这可以加快插入速度,但会导致间隙。缓存序列的规则可能不同。在高事务环境中,缓存不足可能会成为性能瓶颈。跨多个表共享单个序列会使这个问题变得更糟。

从数据管理的角度来看,存在更大的差异。序列需要管理两个对象(表和序列)。表中内置了oridentity列。serial

对于单个表,我只考虑在不支持内置自动增量/序列/标识列的数据库中使用序列(咳咳,“Oracle”)。否则,我将使用设计用于处理表的机制。

我确实想指出,使用自动递增代理键还有其他好处。如果数据库中存在这样的概念,这也应该是用于对数据进行聚类的键。新插入总是位于“末尾”(尽管如果您要删除数据,则页面可能仅被部分使用)。主键也应该是用于外键引用的唯一键,即使其他列(单独或一起)是唯一的候选主键。

  • “在 Postgres 中,这些将被声明为 `serial`” - 在 9.x 中是这样,但 PG10 也支持 `identity` 列。 (2认同)