外键可为空。为什么需要?

问题描述:

我对表中的外键关系的理解是外键是子表中的一列,并且是父表中的主键。我们知道主键是唯一的,而不是空的。我有一些疑惑并且需要澄清。 当父表有数据时,孩子是否还必须有相关数据? 可以子表中有空(外键无效)。 为什么有一个规定外键为空。外键可为空。为什么需要?

我还没有能够正确理解这一切。

帮助我更好地理解这些概念。 在此先感谢。

为什么有一个规定外键为空。

可选参与条件。当一个孩子有单亲或非双亲时,这是建立这些表格之间关系的一种方法。如果值为null,那么孩子没有父母。

如果该值null,那么孩子有家长和价值必须是现有的父ID。

如果你有这样的关系,并且不允许null在外键列中,那么你不能有没有父母的孩子。

可能模型与多对多表,其中没有任何约束将意味着参与是可选的,但要确保一对一的关系,你需要使每个外键列独特(以及NOT NULL)。我个人发现这个选项是过分的(如果需求改变,它可以改变可以)。

两者之间的选择是实用性之一(例如,模型从一对一改为一对多或多对多的可能性),但关系纯粹主义者将采取多对多的选择。

+0

可空的FK约束建模一个(零或一个)对多关系,而不可空的FK约束模拟一对多关系。将(零或一)对多关系建模为多对多关系是一种矫枉过正。 – Alex 2012-08-08 15:28:49

+1

@Alex - 我绝对同意。但纯粹主义者(“数据库中没有NULL”)不会。 – Oded 2012-08-08 15:29:43

实质上可为空的外键意味着该关系是可选的。

假设正在检查FK约束,那么如果外键不为空,它的值必须存在于被引用的表中。

但是,如果外键的值为null,则表示该关系不存在。通常情况下,在这种情况下,您应该选择LEFT/RIGHT OUTER JOIN,以防止在JOIN中过滤出空值。

当状态依赖关系时,可选关系非常有用。 例如如果客户被批准为客户,则只有客户被分配到分支,直到此时,客户的BranchId将为NULL等。