【问题标题】:Table design with composite key requirement具有复合键要求的表设计
【发布时间】:2018-06-30 09:34:07
【问题描述】:

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

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

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

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

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

  3. PK (ID) 自动递增,配置 ID+版本对由代码管理。

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

【问题讨论】:

  • 但是为什么会这样呢?您的设计意味着您有一个单独的仅配置主表,其 PK 为 configD,而您正在谈论的表只是另一个加入此表的表。如果您 没有 有另一个表,那么这个复合键确实没有意义。只要有一个递增的身份并完成它。版本只是一个属性

标签: sql auto-increment composite-primary-key


【解决方案1】:

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

为什么?

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

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

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

【讨论】:

  • 谢谢 Gordon,我现在确信 - 这确实是最好的选择。
猜你喜欢
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 2018-07-11
  • 2013-04-30
  • 2014-01-05
  • 2018-11-22
相关资源
最近更新 更多