如何解决如果我的外键在目标表中是唯一的,我是否需要一个主键?
我有两张桌子:
Object
存储静态数据,PK Object.Id
ObjectStatus
存储瞬态数据,并与 Object
1:1 映射,因此它在 ObjectId
上有一个 FK Object.Id
。
鉴于 FK 是唯一的,并且是唯一标识 ObjectStatus
中记录的唯一合理方式,将 ObjectId
设为 PK 和 FK 是否合理?
解决方法
这种关系是1:0-1
或one to zero or one
,表示子表中的数据相对于主表是可选的。
当主表上有一大块列是可选的时,它通常使用,并且是一种完全合法的方式来设置数据库如果需要。这有点像拥有一组全是 NULL
或全是 NOT NULL
,但不是混合的列,例如可选的 Address
。
您仍应设置主键,但它将与外键位于同一列。
,您没有告诉我们您使用的表服务器的品牌和型号。
许多/大多数使用聚簇主键存储方案,其中支持主键的索引也包含表的数据。如果没有主键,DBMS 会在其幕后为您编写一个主键,以便它有一种存储数据的方法。
因此,您选择的唯一键不是主键,而忽略主键,可能会对性能(空间和时间)产生一些负面影响。
最好使用唯一键作为主键。但是如果没有它,您的数据库将正常运行,如果不是最优的。
,更好的方法可能是:
- 在 ObjectStatus.ObjectId 到 Object.Id 上有一个外键。
- 向 ObjectStatus 添加一个类似于 AddDateTime 的字段,以显示添加行的时间。添加新行时用当前日期/时间填充它。
- 在 ObjectStatus 上设置主键(ObjectId、AddDateTime)。
通过这种方式,您可以跟踪对象状态随时间变化的方式和时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。