mysql - 我可以创建一个带有额外字符的复合键吗?
问题描述
我正在使用 MySQL 构建一个新的数据库来存储从各种项目中学到的经验教训。当我们在办公室谈论这个时,我们通过项目编号和课程编号来指代课程,即PR12-81,其中PR12指的是项目,81指的是该项目中的具体课程。我希望我的数据库中的主键也有一个连字符。
在 SQL 中定义复合键时,我可以使其引用项目和课程,但不使用连字符,即 PR1281。我还考虑过创建一个数据类型为 CHAR(1) 的单独列,在每一行中放置一个连字符并声明 PK 由 3 列组成。
还有另一种方法可以指定要以首选方式格式化的主键吗?
解决方案
让你的表的主键是一个没有任何“意义”的无意义的自增数字。然后,在该表中,定义两列: project_number
和lesson_number
。如果两者需要是唯一的,请定义一个UNIQUE
包含这两个字段的索引。
不要(!)创建将信息嵌入其中的数据库键,即使企业这样做。如果业务需要引用类似 的字符串PR12
,那就这样吧……创建一个列来存储适当的值,或者使用一对多的表。根据需要使用索引来强制唯一性。
注意(!)我现在描述了四列:
- 基于自动增量的“实际”主键,不包含任何信息。
- 列
project_number
,可能是表的外键projects
。 - 同上
lesson_number
。(如果需要,可以使用UNIQUE
复合索引。) - 包含“业务使用的字符串”的列(或表)。
随着时间的推移,商业惯例确实会发生变化。有朝一日,您可能会……不,您会……遇到一个“业务使用的字符串”,该字符串被执行此类操作的人错误分配!您的数据库设计需要优雅地处理这个问题。我所描述的模式是所谓的第三范式。 如果您还没有,请在“普通表单”上进行 Google 搜索。
推荐阅读
- docker - 在 kubernetes 从站中运行的无根目录,“docker run”失败
- api - 如何使用 JSON API 将对象从谷歌云存储下载到本地目录
- python - AttributeError:“PrefetchDataset”对象没有属性“make_initializable_iterator”
- javascript - 根据 id 从文本输入中获取布尔值
- gitlab - Gitlab:当新管道在同一分支上启动时如何自动关闭旧管道?
- python - 在 Python 中使用 8 位无符号算术校验和
- javascript - Material-UI Dialog 如何在对话框的右上角放置关闭按钮
- amazon-web-services - 通过请求另一个函数对 Lambda 函数进行超时会导致超时错误
- javascript - 如何在点击时切换特定标签或组件
- vue.js - 加载在子页面上的 Vue 应用程序的 URL 将更新为站点起始页