3

这个问题已经出现了几次,但我仍然不是 100% 知道它是如何工作的。

我正在为银行基础设施创建一些表。这家银行为一家公司提供服务。公司内部存在可以访问部分或全部这些服务的组,具体取决于权限。但银行内部也有一些与公司无关的团体可以使用这些服务。

我的组表有一个 Group_ID(PK),Company_ID 和 Bank_ID 为 (FK)。这些 FK 是否可以为空,具体取决于该集团是公司集团还是银行集团?

4

4 回答 4

4

可以为空的外键很好(至少在 SQL Server 中,不确定所有 RDBMS)。它只是意味着该列可以为空,但如果不是,则它需要满足约束。

于 2013-06-27T15:31:54.707 回答
1

这取决于你想建立什么样的关系。

如果您尝试建模的关系不需要相关表中存在记录,则 FK 可以为空(因此 0..1 或 0..n 可以为空,而 1..1 或 1..n 不应该为空允许它)。

阅读参考操作,您将开始看到其他一些更详细的信息。

于 2013-06-27T15:38:00.090 回答
0

SQL Server 2008 R2

FOREIGN KEY 约束可以包含空值;但是,如果复合 FOREIGN KEY 约束的任何列包含空值,则会跳过对构成 FOREIGN KEY 约束的所有值的验证。要确保验证复合 FOREIGN KEY 约束的所有值,请在所有参与列上指定 NOT NULL。

带有 InnoDB 的 MySQL 还支持外键中的空值。

于 2013-06-27T15:36:38.613 回答
0

我认为您的基本模型不正确。您可能应该使用包含需要使用系统的任何人(无论是银行、员工还是其他任何人)的记录的整体表(例如,我们称之为用户)。它应该包含对所有类型的用户都相似的信息。这是您将在 USERGroups 表中用于将它们设置为特定组的键。

然后,公司和银行表应该有一个用户表的 FK(它们与用户是一对一的关系,因此值应该是 FK 和 PK)和 taht 表包含每个类型不同的字段的实体。

虽然是的,你可以拥有你描述的结构,但很难强制只允许填写一个键。通常我只会允许 FK 为空,如果它是当时可能不知道的东西记录被创建。例如,在教育环境中,您可能会提前一年为春季课程设置课程表,但有些课程尚未雇用春季学期的讲师,因此 instrutorID 将为空。

于 2013-06-27T15:53:09.597 回答