规范化数据库

时间:2018-03-05 17:19:48

标签: database database-design null relational-database database-normalization

我有两张桌子,警察和违规行为[警察持有警察的数据,违规行为包含所有违规停车的数据],基本的想法是警察可以取消任何数量的违规行为,但只有一个违规行为被取消一个警察。基本上,它可以被视为     (警察PK(用户名))1:M(违规PK(违规#)) 现在,Violations表将警察的用户名作为外键。现在,如果其中一个警察取消了特定的违规行为,那么此警察的用户名,取消的日期和时间也将被添加,而不是在违规表中它将具有空值。

问题是当Violation插入数据库时​​该字段属于Violations表中的警察是NULL并且我希望避免此NULL值。 [我的意思是,(用户名,日期,时间)只有在警方取消违规行为时才有价值,这意味着更新违规行为取消的状态。 ]

3 个答案:

答案 0 :(得分:4)

  

警察可以取消许多违规行为,但是一个警察取消了一次违规行为,这是(警察PK(用户名))1:M(违反PK(违规#))。

不,M为0或1。

  

因此,违规表将警察的用户名设为FK。

仅当您要允许NULL作为用户名时。

如果您没有,则为已取消的违规行为单独制作表格。

 police(username, ...)
 violation(violation#, ...)
 cancelled(violation#, username, ...)

您永远不需要使用可空列。只需确定您想要对您的应用程序/业务情况说出什么样的事情,这些事情将集体完整地描述它们。

时间阅读有关信息建模的书籍,关系模型&数据库设计。

Re normalizing given nulls.

答案 1 :(得分:0)

听起来好像你在谈论一个可选的关系(0或1到M)。 FK中的NULL是指示不存在关系的相当标准的方式 在这种情况下,这意味着没有取消警察,因为违规行为没有取消。对? 我不明白为什么空值在这里是个问题。

但是,如果你想在这里摆脱NULLS,有一个相当简单的方法来做到这一点。只需创建一个关系表,其中包含两个表的FK。并从违规表中删除FK。现在,不要在任何地方使用NULL,只是不要在关系表中插入一行!稍后,当取消确实发生时,只需在relatonshp表中插入一个新行。

答案 2 :(得分:-1)

如果你不想在取消警察""取消警察" FK栏,即使违规取消,您也必须链接到高级职员。

唯一的解决方案是让一名特殊的假警察指示"未取消",也许是一个用户名和生物数据为空白的人。

想要避免空值是一个糟糕的设计选择。正确,最简单,最清晰且普遍接受的处理方法是在未取消违规时在FK列中放置空值。