规范化数据库中 table 的空值

Normalize a null value of table in database

我有两个table,Police和Violations[Police持有警察的数据,而Violations包含所有违章停车的数据],其基本思想是警察可以取消任意数量的Violations 但实际上只有一个 Violations 被一个 police.So 取消了,它可以被看作是 (police PK(username)) 1:M (Violations PK(Violations#)) 现在,Violations table 会将警察的用户名作为外键。现在,如果其中一名警察取消了特定的违规行为,那么该警察的用户名、取消日期和时间也将被添加,而不是它在违规行为中具有空值 table.

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

如果您不想在 "cancelling police officer" FK 列中出现空值,即使违规 被取消,您也必须 link 给官员。

唯一的解决办法是有一个特殊的假警官来指示"not cancelled",也许是一个用户名和个人资料为空的人。

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

the police can cancel many violations but one violation canceled by one police so, it is (police PK(username)) 1: M (violation PK(violation#)).

不是,是0-1到M。

So, violation table will have the username of the police as FK.

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

如果不这样做,您可以单独 table 取消违规。

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

您永远不需要使用可为空的列。只需确定您想对您的 application/business 情况说些什么,这些情况将共同完整地描述它们。

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

Re normalizing given nulls.

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

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

中插入一个新行