这个问题已经出现了几次,但我仍然不是百分之百的问题。
我正在为银行基础设施创建一些表格。该银行为公司提供服务。公司内部存在可以访问部分或全部服务的组,具体取决于权限。但是,银行内部也有与公司无关的团体可以访问这些服务。
我的组表,具有Group_ID(PK),Company_ID和Bank_ID为(FK)。这些FK是否可以为空,具体取决于该组是公司组还是银行组?
答案 0 :(得分:4)
可以为空的外键很好(至少在SQL Server中,不确定所有RDBMS)。它只是意味着列可以为null,但如果不是,那么它需要满足约束。
答案 1 :(得分:1)
这取决于你想要建立什么样的关系。
如果您尝试建模的关系不需要在相关表中存在记录,则FK可以为null(因此0..1或0..n可以为1而不是1..1或1 .. n不应该允许它。)
阅读referential actions,您将开始看到其他更精细的细节。
答案 2 :(得分:0)
外键 约束可以包含空值;但是,如果有任何一列 复合FOREIGN KEY约束包含空值,验证 将跳过构成FOREIGN KEY约束的所有值。要做 确保复合FOREIGN KEY约束的所有值都是 已验证,请在所有参与列上指定NOT NULL。
带有InnoDB的MySQL在外键中也是supports个空值。
答案 3 :(得分:0)
我认为您的基本型号不正确。您可能应该使用整体表(让我们称之为用户为例),其中包含需要使用系统的任何人的记录,无论是银行还是员工或任何人。它应该包含和所有类型的用户相似的信息。这是您在USERGroups表中用于将它们设置为特定组的关键。
然后公司和银行表应该有一个FK到用户表(与用户一对一关系,因此值应该是FK和PK)和taht表coantnas不同的字段对于每种类型的实体。
虽然是的,你可以拥有你描述的结构,很难强制只允许填充其中一个键。通常我只允许FK为空,如果它可能是未知的在创建记录时。例如,在教育环境中,您可能会设置一个接近一年的春季课程安排,但是有一些课程,其中春季学期的指导员尚未被聘用,因此instrutorID将为空。