首页 > 解决方案 > 具有复合键要求的表设计

问题描述

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

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

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

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

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

  3. PK (ID) 使用代码管理的 configID+version 对自动递增。

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

标签: sqlauto-incrementcomposite-primary-key

解决方案


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

为什么?

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

这也有一些不错的好处。这允许您更改与每对关联的配置或版本。您现在可能不想这样做。但在未来,你可能会说:“天哪,我希望我能轻松删除一个版本”。或者,“这两个客户端合并了,我想将它们的配置整合在一起。”

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


推荐阅读