非空外键作为数据库标准

时间:2009-11-18 23:50:12

标签: null foreign-keys relational-database

背景:今天,使用SQL Server Reporting Services时出现了一个问题。似乎报表查看器中的SSRS下拉参数不允许您指示(null)选项,以便您可以看到该参数为null的报表。基本上,表A是一个可以无形地引用表B的表;由于报表使用表B来填充下拉列表,因此没有空值显示为选项,因此您无法选择所有具有空值B的A。

我真正的问题来自于我正在回答的管理类型对上述问题的潜在反应。当我解释发生了什么时,她发布了一项新的授权,即所有外键必须是非空的,并且每个实体都应该插入一个“默认”记录,一个似乎在报告工具中解决这个问题的新标准。基本上,如果你有一个Cat表,那么Cat.Owner永远不应该为null,而应该引用Person表中的默认记录,即“默认”Person。

虽然这可能有助于解决SSRS问题,但它可能会损害使用数据库的服务和应用程序的开发/维护,因为他们现在不仅要考虑空值(这是允许到这一点),而且还要寻找并正确使用“默认”记录。我想过尝试与她讨论任务,但我想在我决定这样做之前从经验丰富的人那里收集一些信息。

有人可以权衡这可能会有什么帮助或伤害吗?

有人将此作为数据库标准吗?任何问题,发展或其他方面,我应该留意?

2 个答案:

答案 0 :(得分:2)

NULL字段表示无值

因此用NULL填充缺失的关系是合乎逻辑和正确的。

我有时会在某些特殊情况下看到问题中描述的使用默认记录。但这是一个“特殊情况”并且“有时”使用。

恕我直言强迫这项政策作为数据库发展标准只是愚蠢,不正确和潜在的危险。我不会冒险从这种设计中产生的所有可能的复杂情况:我猜你已经想象了这意味着什么。

答案 1 :(得分:0)

虽然如果CAT是OWNED_CAT,那么它必须有一个PERSON作为所有者,如果它被放弃,它不应该在那个表中。

但是,如果CAT是ANY_CAT(有/无所有者),则该被放弃的CAT不应与任何PERSON关联。

对我而言,为了报告而在PERSON表中创建虚拟或默认记录确实具有商业意义(对于您的经理而言),但我对此感觉不对。

不能给你太多,只需2美分。