Database 规范化数据库中表的空值

Database 规范化数据库中表的空值,database,database-design,null,relational-database,database-normalization,Database,Database Design,Null,Relational Database,Database Normalization,我有两个表,警察和违规(警察持有警察的数据,违规包含所有停车违规的数据),基本思想是一个警察可以取消任意数量的违规行为,但一个警察只能取消一个违规行为。因此,本质上,它可以被视为 (警察主键(用户名))1:M(违规主键(违规) 现在,违规表将警察的用户名作为外键。现在,如果其中一个警察取消了特定的违规行为,那么这个警察的用户名,取消的日期和时间,也将被添加,而不是这个。它在违规行为表中有一个空值 问题是,当将违规插入数据库时,违规表中属于police的字段为NULL,我希望避免这个NULL值。

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

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

如果您不希望“取消警察”FK列中出现空值,则即使未取消违规,您也必须链接到警察

唯一的解决办法是让一名特殊的假警官指出“未取消”,也许是一个用户名和生物数据为空的警察

想要避免空值是一个糟糕的设计选择。正确、最简单、最清晰和普遍接受的处理方法是在未取消冲突时在FK列中输入null

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

不,是0或1比M

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

仅当您希望允许NULL作为用户名时

如果没有,则为取消的违规行为创建单独的表

 police(username, ...)
 violation(violation#, ...)
 cancelled(violation#, username, ...)
您永远不需要使用可为空的列。只需确定您想对您的应用程序/业务情况说些什么,这些都将全面描述它们

是时候读一本关于信息建模、关系模型和数据库设计的书了


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


但是,如果您想在这里消除空值,有一个相当简单的方法。只需创建一个关系表,其中包含两个表的FKs。并从冲突表中删除FK。现在,不要在任何地方使用NULL,只要不要在关系表中插入行就行了!稍后,当确实发生取消时,只需在relatonshp表中插入新行。

Hi。您仍然不清楚您的设计或问题。您在设计中放置了一个可为null的列,但您不想要一个可为null的列——那么为什么要将它放置在其中呢?如果您不知道如何在不使用空值的情况下对此进行建模&您想知道如何建模,请编辑您的问题以说明这一点。(这不是一个正常化的改变。)现在你没有清楚地表达你的“问题”。但是,根据我的第一条评论,在发布“总是用谷歌搜索你的问题/问题/目标的许多清晰、简洁和具体的版本/措辞,并阅读许多答案”之前。PS请将澄清编辑成帖子,而不是评论。谢谢你是的,正如你所说的0-1到M。但是你的解决方案是否参考了任何规范化规则。或者我可以做这个解决方案,即使它不适用于任何FD。那么它将改变的关系又是什么呢?这与我在地图绘制中所做的不一样吗?我说,你的问题不清楚。我回答了这个问题,因为你的意思似乎是“什么是这个设计的无空版本”。我说,选择与正常化无关。如果你认为是这样的话,那么请发布一个新问题,清楚完整地解释你在遵循一些关于如何规范化的参考教科书后,在哪里以及如何陷入困境。请尽可能多地给我一个建议。不过,我无法理解你评论中的大部分语言。PS你在这里所说的每一句话都是谬论。@有一天怎么会这样?也许你能给我一些启发。看看@philipxy的答案,看看为什么你的第一句话是错的。避免空值是正确的设计选择;SQL的三值逻辑是不直观的、不必要的复杂且实现不一致的。许多其他人避免SQL空值,因此您的“普遍接受的”断言是不真实的。我不确定我是否见过只有一个解决方案的SQL问题!另外,虽然我在C#中使用了空对象模式,但你的“特别假警官”建议听起来很糟糕。