我需要代表一个名为电子报告的表单,用户将在其中添加数据。
每个E - Report
都会有QAP
,而QAP
每个Defects
会有两个或更多CRS
。
这些缺陷将在此表中显示:
第一次,这个表有两个缺陷,用户可以从QAP中添加更多缺陷,或者如果他/她认为有必要,可以插入新缺陷。
用户将选中是否CRF
,MA
,MI
和EReportDefect
列,我会将这些数据保存在QAP
表格中。
顺便说一下,Defect
和Defect
数据将在网络服务中,我需要将其下载到我的Android设备。我无法修改这两个表添加更多数据。
表示我设计了这个Visio:
因为我无法向EReportDefect
表添加数据,所以我创建了CRS
表来存储CRF
,MA
,MI
和{{1用户数据并存储用户创建的新缺陷。
为了表示用户添加的新Defect
,我将EReportDefect.defectId
设置为NULL,并将EReportDefect.description
设置为存储新的缺陷说明。
这些新缺陷对EReportDefect.defectId
和EReportDefect.description
上的值没有任何价值。
这是对的吗?我可以使用具有NULL值的外键列吗?你知道更好的方法吗?
答案 0 :(得分:3)
可以为空的外键完全可以接受。
考虑以下情况,一个消息表,旨在由用户响应。
CREATE TABLE Messages
(
MessageId int,
MessageText varchar(256),
AnsweredByUserId int
)
现在,当首次创建初始未应答消息时,AnsweredByUserId将为NULL。这完全没问题。该消息尚未得到解答,因此我们不希望在那里找到值。
当有人回复消息时,我们希望将他们的UserId放入AnsweredByUserId,并且我们希望在发生这种情况时强制执行引用约束(例如,我们希望确保我们插入的UserId实际存在于Users表中)。
总之,在适当的情况下拥有一个NULLABLE外键很好。