我了解您使用外键将一个表中的行与另一个表相关联,如果此外键也成为该表的主键,那么它就是主外键。
但是,例如,如果酒店记录了每个客户的入住日期和时间,并且每个客户都有一个客户 ID,我应该将客户 ID 作为主外键还是仅包含外键?因为一次可以有多个签到所以日期和时间不足以作为主键?
我了解您使用外键将一个表中的行与另一个表相关联,如果此外键也成为该表的主键,那么它就是主外键。
但是,例如,如果酒店记录了每个客户的入住日期和时间,并且每个客户都有一个客户 ID,我应该将客户 ID 作为主外键还是仅包含外键?因为一次可以有多个签到所以日期和时间不足以作为主键?
已经有一个公认的答案。这个答案可能会为这个话题带来新的启示。
查找“共享主键”。这是一种设计技术,通常在存在一对一关系时使用,并且在一个方向上是强制性的,但在另一个方向上是可选的。IS-A 类型关系符合这种模式。例如,每辆车都是一辆车,但不是每辆车都是一辆车。(有些是卡车或摩托车等)。
这种模式在对象建模中称为超类/子类,在 ER 建模中称为泛化/专业化。
在共享主键中,表中的一列被声明为该表中的主键,以及引用其他表的主键的外键。继续我们的示例,CAR 表中的 ID 字段将是主键,也是引用 VEHICLE 表的 PK 的外键。
这允许每辆车都有一个分配的身份,而无需引入另一个标识符,并且它允许在 VEHICLE 和 CAR 之间快速连接。
当您进行查找时,您将获得更多详细信息。
请注意,我避免使用充其量令人困惑的术语“主外键”。
它不能是“主外键”,因为 a
PRIMARY KEY
总是UNIQUE
(andNOT NULL
) 并且可能客户可以再次签到,可能在不同的日期或时间。PRIMARY FOREIGN KEY
在我看来,在您引用的表不是复合键的所有情况下, A都是一种反模式。这意味着存在严格的 0-1:1 关系,就像所有NULLABLE
列一样。而且在所有情况下,在大多数数据库中,最好将此类关系放在原始表中的列中,并让DEFAULT
它们NULL
.完全没问题。如果
b
不存在或不适用,您可以将其设置为NULL
(或让它默认为)。有点傻。我唯一能看到这有意义的是这样的,
在上述情况下
bar
,有一个复合主键,它a
是引用表的一个组成部分foo
。