我对表中外键关系的理解是,外键是子表中的列,是父表中的主键。我们知道主键是唯一的,不为空。我有一些疑问,需要澄清。当父表有数据时,子表是否也必须有相关数据?子表可以有空值(外键空值)。为什么规定外键为空。
我一直无法正确理解这一切。
帮助我更好地理解这些概念。提前致谢。
为什么规定外键为空。
可选的参与条件。当孩子有单亲或非单亲时,这是对表之间的这种关系进行建模的一种方法。
如果值为null
,则孩子没有父母。
如果该值不是 null
,则该子级有一个父级,并且该值必须是现有的父级 ID。
如果你有这样的关系并且不允许null
在外键列中,那么你不能有没有父母的孩子。
您可以使用多对多表对此进行建模,没有任何约束意味着参与是可选的,但为了确保一对一的关系,您需要使每个外键列唯一(以及NOT NULL
) . 我个人觉得这个选项有点矫枉过正(如果需求发生变化,它可以改变)。
两者之间的选择是实用性之一(例如,模型从一对一变为一对多或多对多的可能性有多大?),尽管关系纯粹主义者会选择多对多选项。
可空外键本质上意味着关系是可选的。
假设正在检查 FK 约束,则如果外键不为空,则其值必须存在于引用的表中。
但是,如果外键的值为空,则表示该关系不存在。通常,在这种情况下,您将使用 LEFT/RIGHT OUTER JOIN 来防止空值在 JOIN 中被过滤掉。
当关系依赖于状态时,可选关系很有用。例如,只有当客户被批准为客户时,客户才会被分配到分支机构,在此之前,客户的BranchId
将为 NULL,等等。