一个 CK 可以有一个 FK 引用另一个 table 中的 CK 吗?

Can a CK have a FK referencing to a CK in another table?

举个例子:

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

Dept_name是部门table的CK。

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

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

"CK (candidate key) of a given table"的两个定义是:

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

如果没有我们正在使用的定义所需的信息,我们无法确定 table 的 CK。例如,所有的 FD(函数依赖),或 FD 的规范覆盖或子行值唯一的所有列集等。该信息始终可以在不涉及另一个 table.

的情况下表达

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

Dept cannot be part of candidate key (ex.: Dept, FirstName, LastName, Birthdate) in Employee table since Dept is not set as primary key in Department table

Dept 不是 in Employee,因此它不能成为它的 CK 的一部分。但是如果你加上了,是不是它的CK就和其他tables无关了。

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

如果 "Dept" 是 "Dept#" 的拼写错误:Dept# 是或不是部门 table 的 PK 这一事实与另一个部门的 CK 无关table。是不是PK vs CK总是无关紧要的。

But can I still call Dept a candidate key just knowing that Dept is a candidate key in the Department table?

系系CK。所以在英语中我们可以说它是 CK。但是成为 CK 就是成为特定 table.

的 CK

也许你的意思是 "can I still call Dept a CK" of Employee just knowing...”。只有当你证明它是一个。它是否是一个独立于任何其他 table.

(也许你应该在这个问题中称某些事情为 FKs?)

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