在避免空值的情况下表示可选关系的唯一方法是使用另一个表,如其他一些答案所建议的。然后,对于给定的人没有行表示该人没有发票。通过使PERSON_ID是主要或唯一键此表和Person表1之间的关系:
CREATE TABLE PersonInvoice (
person_id INT NOT NULL PRIMARY KEY,
invoice_id INT NOT NULL,
FOREIGN KEY (person_id) REFERENCES Person(id),
FOREIGN KEY (invoice_id) REFERENCES Invoice(id)
);
如果你要允许每个人拥有多张发票,你可以声明的主键可以强制执行1作为一对列。
但是这种解决方案是为了满足您的要求,以避免NULL。这是人为的要求。 NULL在数据模型中具有合法的位置。
一些像Chris Date这样的关系数据库理论家避开了NULL,解释了NULL的存在会导致关系逻辑中一些令人不安的逻辑异常。对于这个阵营来说,上面没有一行是代表缺失数据的更好方法。
但其他理论家,包括E.F。撰写关于关系理论的开创性论文的Codd承认占位符的重要性,意味着“不知道”或“不适用”。 Codd甚至在1990年的书中提出,SQL需要两个占位符,一个用于“缺少但适用”(即未知),另一个用于“缺失但不适用”。
对我来说,我们在某些方面使用NULL时看到的异常就像我们在算术中看到的未定义结果,除以零。解决方案是:不要那样做。
但是当然我们不应该使用任何非NULL值,如0或''(空字符串)来表示缺失的数据。同样,我们不应该使用NULL,就好像它是一个普通的标量值。
我在我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming的一篇名为“对未知的恐惧”一章中写了更多关于NULL的内容。
'NULL'具体用于*当你没有值的情况下 - 所以在这种情况下,我认为使用'NULL'是最合适的方法。 –
虽然我通常会同意保持一致性,但我完全不同意dbs中的'NULL hating'。这绝对不是您想要进一步传播的想法。这很愚蠢,而且根本没有建设性。 –
每个人只能有一张发票吗?您拥有它的方式,似乎每张发票都可以有多个人,但是没有其他方式。 –