Table 具有复合键要求的设计

Table design with composite key requirement

我正在构建用于存储特定于客户端的配置的数据库。每个配置都应有一个唯一的 ID(整数)和一个版本(整数)。只有它们中的一对应该是唯一的,这促使我创建一个复合键。但是,问题是 ID 可能会自动生成,而版本应始终从 1 开始,并在每次对配置进行更改时递增。

这里的大多数帖子都不建议使用复合键,也不建议使用 SQL 自动递增的复合键。我同事的建议之一是添加一个单独的 ID 作为单个主键,并在应用程序代码中自行管理 configID+Version 对分配和唯一性。

最后,我看到了 3 个选项:

  1. PK(configID,version) 手动生成两者

  2. PK (configID,version) 自动递增配置ID和手动分配版本

  3. PK (ID) 自动递增,configID+version 对由代码管理。

你能告诉我最好的选择是什么吗?也许还有别的?

您应该选择第三个选项,自动递增的 ID。

为什么?

主键有多种用途。也许最重要的是它唯一地标识了外键引用的 table 中的每一行。单列外键比复合外键简单得多——无论是在定义键方面还是在性能方面。两列通常占用 space 多于 1.

这也有一些不错的好处。这允许您更改与每对关联的配置或版本。您现在可能不想这样做。但是以后,你可能会说:"Gosh, I wish I could easily delete a version"。或者,"These two clients merged and I want to bring together their configurations."

让配置自动递增也可能有意义。对此我不确定。要分配版本,您需要一个触发器来维护每个配置的序号。