数据库,使用null作为三元选项的不良做法?

时间:2011-03-01 11:50:45

标签: database database-design null

我之前从未使用过null,我倾向于避免使用它并将其存在于我的数据中。但是我最近设计了这个表(简化):

tblPeopleWhoNeedToCastVotes
User |  hasVotedYes

在这种情况下,hasVotedYes可以为null,true或false。 Null表示他们尚未投票(有用的信息)。

这是不好的做法还是罚款?

6 个答案:

答案 0 :(得分:3)

这实际上是NULL用于 - 数据不可用的地方。来自Wikipedia

  

Null是结构化查询语言(SQL)中使用的一种特殊标记,用于指示数据库中不存在数据值。

我不建议将它用作一般的“第三选项”,我会使用tinyint并将其映射到代码中的Enum。但是,对于Yes / No和Unknown,我会说NULL可能是最好的方法,因为在数据库中读取0/1/2不太清楚。

答案 1 :(得分:2)

我宁愿选择DEFAULT值而不是NULL。因此,在像MySQL这样的数据库中,我将创建一个列

hasVotedYes TINYINT(1) DEFAULT 0

当用户投票“反对”时我将更改为1,如果用户投票“赞成”,我会将其标记为2.但是,默认为NULL NOT 是一种不良做法,直到你处理应用程序代码中的NULL对象。


想一想,我猜默认值甚至更好。例如,您想要过滤投票赞成,投票反对或未投票的用户 - 您将创建类似

的准备语句
 ... where hasVotedYes = ?;

如果是NULL默认值,您将编写两种类型的查询。

... where hasVotedYes = ?

这适用于投票赞成或反对案件。

.... where hasVotedYes is NULL;

这是未投票的案例。

答案 2 :(得分:1)

我会去

tblPeopleWhoNeedToCastVote
User | Voted

投票可以为空的位:1 =是,0 =否,空=未投票。

否则(当不使用null时)你需要知道:

答:此人已投票

B:他投了什么票。

通过不使用NULL B将默认为0.当想要创建所有投票赞成(1)或否(0)的人的查询时,这可能会很烦人,那么您必须检查该人是否已投票。 / p>

使用NULL时,您可以简单地查询1或0。

答案 3 :(得分:1)

Null已针对此用途而构建。它(应该)意味着:不是保佑,不知道。

唯一的缺点是当你想知道没有投票的人数时是的:你可能需要将null转换为某些东西,否则结果将不正确。

 select * from tblPeople as t where t.hasVotedYes <> 'Y'; -- Don't counts nulls

 select * from tblPeople as t where nvl(t.hasVotedYes, 'N') <> 'Y'; -- counts nulls.

答案 4 :(得分:1)

我对UNKNOWN使用NULL但是如果你要对数据做很多搜索子句以确保你没有犯错,你还应该考虑三个值逻辑,请看这个图像: three value logic

答案 5 :(得分:0)

Null被用于各种各样的事情,但通常会导致矛盾和不正确的结果。

在这种情况下,您的困境似乎源于尝试将过多的信息重载到单个二进制属性中 - 您试图记录是否一个人投票和如何他们投了票。这本身可能会给你带来麻烦。

我真的没有看到你希望通过使用null来表示一个人没有投票的情况。为什么不在 投票之前不存储信息。这样,没有一行显然表明一个人还没有投票。