微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果我的外键在目标表中是唯一的,我是否需要一个主键?

如何解决如果我的外键在目标表中是唯一的,我是否需要一个主键?

我有两张桌子:

Object 存储静态数据,PK Object.Id

ObjectStatus 存储瞬态数据,并与 Object 1:1 映射,因此它在 ObjectId 上有一个 FK Object.Id

鉴于 FK 是唯一的,并且是唯一标识 ObjectStatus 中记录的唯一合理方式,将 ObjectId 设为 PK 和 FK 是否合理?

解决方法

这种关系是1:0-1one to zero or one,表示子表中的数据相对于主表是可选的。

当主表上有一大块列是可选的时,它通常使用,并且是一种完全合法的方式来设置数据库如果需要。这有点像拥有一组全是 NULL 或全是 NOT NULL,但不是混合的列,例如可选的 Address

您仍应设置主键,但它将与外键位于同一列。

,

您没有告诉我们您使用的表服务器的品牌和型号。

许多/大多数使用聚簇主键存储方案,其中支持主键的索引也包含表的数据。如果没有主键,DBMS 会在其幕后为您编写一个主键,以便它有一种存储数据的方法。

因此,您选择的唯一键不是主键,而忽略主键,可能会对性能(空间和时间)产生一些负面影响。

最好使用唯一键作为主键。但是如果没有它,您的数据库将正常运行,如果不是最优的。

,

更好的方法可能是:

  1. 在 ObjectStatus.ObjectId 到 Object.Id 上有一个外键。
  2. 向 ObjectStatus 添加一个类似于 AddDateTime 的字段,以显示添加行的时间。添加新行时用当前日期/时间填充它。
  3. 在 ObjectStatus 上设置主键(ObjectId、AddDateTime)。

通过这种方式,您可以跟踪对象状态随时间变化的方式和时间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?