sql - 外键的哪一列:id 或任何其他列,为什么?
问题描述
TL;博士
- 外键是否应该始终引用另一个表的 id 列?为什么或者为什么不?有这方面的标准规则吗?
- 使用除外键列之外的任何其他唯一列是否会产生成本
id
?性能/存储?有多大意义?是不是被业界诟病?
示例:这是我的示例问题的架构:
在我的模式中,有时我使用id
列作为外键,有时使用其他数据列。
在
vehicle_detail
表中,我使用unique
size
列作为表中的外键vehicle_size
,unique
color
列作为表中的外键vehicle_color
。但是在
vehicle_user
我使用user_identifier_id
作为外键引用表中的id
主键列user_identifier
。
哪个是正确的方法?
附带说明一下,我没有id
用于 、 和 表的列garage_level
,因为garage_spaceid
它们只有一列作为主键,并且它们存储的数据在每个表中最多只有 15 行,而且它可能永远不会改变. 我还应该在那些栏目中有一个专栏吗?vehicle_garage_status
vehicle_parking_status
id
解决方案
外键必须以主键或唯一约束为目标。引用主键是正常的,因为您通常希望引用另一个表中的单个行,而主键是表行的标识符。
从技术角度来看,外键是引用主键还是另一个唯一约束无关紧要,因为在 PostgreSQL 中,两者都以相同的方式实现,使用唯一索引。
size
至于您的具体示例,将唯一列作为外键的目标并没有错vehicle_size
,尽管它引出了一个问题,为什么您没有创建size
主键并id
完全省略该列。不需要每个表都有一个id
作为自动生成的数字主键的列,除非可能有 ORM 和其他软件需要它。
推荐阅读
- batch-file - 如何在 echo 中将命令作为字符串执行
- python - 在异步协程中捕获异常
- node.js - NestJs:无法执行命令:npm install --silent
- java - 如何使用 simpleJdbcCall 在存储过程中获取 XML 输出参数
- javascript - 如何在嵌入式音频上应用 JavaScript 函数?
- php - 当用户输入错误的url php时如何重定向到404错误页面
- c# - 如何使用 Peta Poco 将自动递增的 id 设置为另一列
- sql-server - Import-Module SQLServer 无法加载文件或程序集 Microsoft.SqlServer.ConnectionInfo 或 Microsoft.SqlServer.Smo
- docker - Golang 和 Gitlab 持续集成
- django - 如何翻译 Django 过滤器中的字段?