Database design 允许空值的外键列
我需要表示一个名为E-Report的表单,用户将在其中添加数据 每个E-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
报告
将有一个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并不奇怪。