允许空值的外键列

时间:2012-10-02 09:18:06

标签: database-design foreign-keys relational-database

我需要代表一个名为电子报告的表单,用户将在其中添加数据。

每个E - Report都会有QAP,而QAP每个Defects会有两个或更多CRS

这些缺陷将在此表中显示:

enter image description here

第一次,这个表有两个缺陷,用户可以从QAP中添加更多缺陷,或者如果他/她认为有必要,可以插入新缺陷。

用户将选中是否CRFMAMIEReportDefect列,我会将这些数据保存在QAP表格中。

顺便说一下,DefectDefect数据将在网络服务中,我需要将其下载到我的Android设备。我无法修改这两个表添加更多数据。

表示我设计了这个Visio:

enter image description here

因为我无法向EReportDefect表添加数据,所以我创建了CRS表来存储CRFMAMI和{{1用户数据并存储用户创建的新缺陷。

为了表示用户添加的新Defect,我将EReportDefect.defectId设置为NULL,并将EReportDefect.description设置为存储新的缺陷说明。

这些新缺陷对EReportDefect.defectIdEReportDefect.description上的值没有任何价值。

这是对的吗?我可以使用具有NULL值的外键列吗?你知道更好的方法吗?

1 个答案:

答案 0 :(得分:3)

可以为空的外键完全可以接受。

考虑以下情况,一个消息表,旨在由用户响应。

CREATE TABLE Messages 
(
  MessageId int,
  MessageText varchar(256),
  AnsweredByUserId int
)

现在,当首次创建初始未应答消息时,AnsweredByUserId将为NULL。这完全没问题。该消息尚未得到解答,因此我们不希望在那里找到值。

当有人回复消息时,我们希望将他们的UserId放入AnsweredByUserId,并且我们希望在发生这种情况时强制执行引用约束(例如,我们希望确保我们插入的UserId实际存在于Users表中)。

总之,在适当的情况下拥有一个NULLABLE外键很好。