sql - 具有复合键要求的表设计
问题描述
我正在构建用于存储客户端特定配置的数据库。每个配置都应该有一个唯一的 ID(int) 和一个版本(int)。只有它们对是唯一的,这促使我创建一个复合键。但是,问题是 ID 可能是自动生成的,而 version 应始终从 1 开始,并在每次更改配置时递增。
这里的大多数帖子都不建议既不使用复合键,也不建议使用具有 SQL 自动增量的复合键。我同事的建议之一是添加一个单独的 ID 作为单个主键,并由我自己在应用程序代码中管理 configID+Version 对分配和唯一性。
所以,最后,我看到了 3 个选项:
PK(configID,version) 手动生成两者
具有自动递增配置 ID 和手动分配版本的 PK (configID,version)
PK (ID) 使用代码管理的 configID+version 对自动递增。
你能告诉我什么是最好的选择吗?也许还有别的?
解决方案
您应该选择第三个选项,即自动递增的 id。
为什么?
主键有多种用途。也许最重要的是它唯一地标识表中的每一行以供外键引用。单列外键比复合外键简单得多——无论是在定义键方面还是在性能方面。两列通常比一列占用更多空间。
这也有一些不错的好处。这允许您更改与每对关联的配置或版本。您现在可能不想这样做。但在未来,你可能会说:“天哪,我希望我能轻松删除一个版本”。或者,“这两个客户端合并了,我想将它们的配置整合在一起。”
让配置自动递增也可能有意义。对此我不确定。要分配版本,您需要一个触发器来维护每个配置的序列号。
推荐阅读
- tensorflow - 我们不能在 tensorflow 中为 tf.get_variable 中的张量命名吗?
- outlook - 通过 API(而不是仪表板)更改 MS Exchange 设置
- java - 将java对象存储在json文件中
- c++ - 无法在 Visual Studio 中使用指针和 fstream 运行程序
- apache-httpasyncclient - IllegalArgumentException:CloseableHttpAsyncClient 中的“身份验证方案可能不为空”
- angular - 在 Angular 6 中使用 HttpClient 下载文件
- traefik - Traefik 2.0:如何配置 `traefik.frontend.rule=Host:example.com`?
- python - 将元素(文本)一分为二
- vb.net - 如何从 http 套接字发送 Memorystream
- javascript - 如何使用 javascript 在站点中的所有页面/内部链接之间传递 URL 参数?