Database design 允许空值的外键列

Database design 允许空值的外键列,database-design,foreign-keys,relational-database,Database Design,Foreign Keys,Relational Database,我需要表示一个名为E-Report的表单,用户将在其中添加数据 每个E-报告将有一个QAP,每个QAP将有两个或两个以上的缺陷 这些缺陷将在此表中显示: 第一次,此表将有两个缺陷,用户可以从QAP中添加更多缺陷,或者在他/她认为必要时插入新的缺陷 用户将检查或不检查CRS、CRF、MA和MI列,我将把这些数据保存在EReportDefect表中 顺便说一下,QAP和Defect数据将在网络服务中,我需要将其下载到我的Android设备上。我无法修改这两个表以添加更多数据 为了表示我设计了此Vi

我需要表示一个名为E-Report的表单,用户将在其中添加数据

每个E-
报告
将有一个
QAP
,每个
QAP
将有两个或两个以上的
缺陷

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

第一次,此表将有两个缺陷,用户可以从QAP中添加更多缺陷,或者在他/她认为必要时插入新的缺陷

用户将检查或不检查
CRS
CRF
MA
MI
列,我将把这些数据保存在
EReportDefect
表中

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

为了表示我设计了此Visio:

因为我无法将数据添加到
Defect
表中,我创建了
EReportDefect
表来存储
CRS
CRF
MA
MI
用户数据,并存储用户创建的新缺陷

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

这些新缺陷在
EReportDefect.defectId
上没有值,在
EReportDefect.description
上有值


这是正确的吗?我可以有一个空值的外键列吗?您知道更好的方法吗?

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

考虑以下情况,一个消息表被设计为用户响应

CREATE TABLE Messages 
(
  MessageId int,
  MessageText varchar(256),
  AnsweredByUserId int
)
现在,当第一次创建初始未应答消息时,AnsweredByUserId将为NULL。那很好。该消息尚未得到答复,因此我们不希望在其中找到价值

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


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

我并没有真正阅读所有这些内容,但允许外键为null并不奇怪。