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