我有两张桌子,警察和违规行为[警察持有警察的数据,违规行为包含所有违规停车的数据],基本的想法是警察可以取消任何数量的违规行为,但只有一个违规行为被取消一个警察。基本上,它可以被视为 (警察PK(用户名))1:M(违规PK(违规#)) 现在,Violations表将警察的用户名作为外键。现在,如果其中一个警察取消了特定的违规行为,那么此警察的用户名,取消的日期和时间也将被添加,而不是在违规表中它将具有空值。
问题是当Violation插入数据库时该字段属于Violations表中的警察是NULL并且我希望避免此NULL值。 [我的意思是,(用户名,日期,时间)只有在警方取消违规行为时才有价值,这意味着更新违规行为取消的状态。 ]
答案 0 :(得分:4)
警察可以取消许多违规行为,但是一个警察取消了一次违规行为,这是(警察PK(用户名))1:M(违反PK(违规#))。
不,M为0或1。
因此,违规表将警察的用户名设为FK。
仅当您要允许NULL作为用户名时。
如果您没有,则为已取消的违规行为单独制作表格。
police(username, ...)
violation(violation#, ...)
cancelled(violation#, username, ...)
您永远不需要使用可空列。只需确定您想要对您的应用程序/业务情况说出什么样的事情,这些事情将集体完整地描述它们。
时间阅读有关信息建模的书籍,关系模型&数据库设计。
答案 1 :(得分:0)
听起来好像你在谈论一个可选的关系(0或1到M)。 FK中的NULL是指示不存在关系的相当标准的方式 在这种情况下,这意味着没有取消警察,因为违规行为没有取消。对? 我不明白为什么空值在这里是个问题。
但是,如果你想在这里摆脱NULLS,有一个相当简单的方法来做到这一点。只需创建一个关系表,其中包含两个表的FK。并从违规表中删除FK。现在,不要在任何地方使用NULL,只是不要在关系表中插入一行!稍后,当取消确实发生时,只需在relatonshp表中插入一个新行。
答案 2 :(得分:-1)
如果你不想在取消警察""取消警察" FK栏,即使违规未取消,您也必须链接到高级职员。
唯一的解决方案是让一名特殊的假警察指示"未取消",也许是一个用户名和生物数据为空白的人。
想要避免空值是一个糟糕的设计选择。正确,最简单,最清晰且普遍接受的处理方法是在未取消违规时在FK列中放置空值。