0

举个例子:

Department (**Dept**, Dept_name)  
Employee(**RegNo**, FirstName, LastName, BirthDate, Dept_fk, Salary, City)  

Dept_name 是 Department 表的 CK。

Dept_fk 是否可以成为 Employee 中 CK(Dept_fk, FirstName, LastName, Birthdate) 的一部分,因为 Dept_name 未设置为 Department 表中的主键?

编辑:我修改了一些属性名称以使其更易于理解。Dept_fk 是在 Department 表中引用 Dept 的外键。

4

1 回答 1

0

“给定表的CK(候选键)”的两个定义是:

  • 表中的列集,它在功能上确定每一列,并且不包含更小的此类集。
  • 表中的列集,其子行值是唯一的,并且不包含更小的此类集。

如果没有我们正在使用的定义所需的信息,我们就无法确定表的 CK。例如,所有 FD(功能依赖),或 FD 的规范覆盖或子行值唯一的所有列集等。这些信息总是可以在不涉及另一个表的情况下表达。

我们可以选择一个表的一个 CK 来调用它的“那个”PK(主键)。PK 在关系理论中是无关紧要的。(如果您使用的是 ER 方法并且它有关于 PK 与 CK 的规则,那么您应该引用并标记它。)

Dept 不能是 Employee 表中候选键(例如:Dept、FirstName、LastName、Birthdate)的一部分,因为 Dept 未设置为 Department 表中的主键

Dept 不在Employee 中,因此它不能成为 CK 的一部分。但是如果你添加它,它是否是它的一个CK是独立于其他表的。

如果您问是否可以根据 Dept 是 CK 与 PK 之间的区别来做某事:PK 总是无关紧要的。

如果“Dept”是“Dept#”的拼写错误:仅 Dept# 是或不是 Department 表的 PK 这一事实与另一个表的 CK 无关。无论是PK vs CK总是无关紧要的。

但是我仍然可以只知道 Dept 是 Department 表中的候选键就将 Dept 称为候选键吗?

这是部门的CK。所以在英语中我们可以说它是一个CK。但成为 CK 就是成为特定表的 CK 。

也许你的意思是“我仍然可以称 Dept 为 CK”的员工只是知道......”。只有当你证明它是一个。并且它是否是一个独立于任何其他表时。

(也许您应该在这个问题中称某些东西为 FK?)

PS 一列可以出现在多个表中,它们之间没有 FK。(“参考”仅在您谈论 FK 时才有用。)不同的列之间可以有 FK。当且仅当一组列中的所有子行值都出现在另一列(“引用”)中时,才存在 FK。SQL FK 只需要转到超键(CK 的超集)而不是 CK。FK 可以来自任何列集:FK 只是引用表中的(超)键。了解 FD、superkey、CK、PK、FK(到 CK 或 superkey)的定义

于 2015-10-16T09:43:00.483 回答