我之前从未使用过null,我倾向于避免使用它并将其存在于我的数据中。但是我最近设计了这个表(简化):
tblPeopleWhoNeedToCastVotes
User | hasVotedYes
在这种情况下,hasVotedYes可以为null,true或false。 Null表示他们尚未投票(有用的信息)。
这是不好的做法还是罚款?
答案 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但是如果你要对数据做很多搜索子句以确保你没有犯错,你还应该考虑三个值逻辑,请看这个图像:
答案 5 :(得分:0)
Null被用于各种各样的事情,但通常会导致矛盾和不正确的结果。
在这种情况下,您的困境似乎源于尝试将过多的信息重载到单个二进制属性中 - 您试图记录是否一个人投票和如何他们投了票。这本身可能会给你带来麻烦。
我真的没有看到你希望通过使用null来表示一个人没有投票的情况。为什么不在 投票之前不存储信息。这样,没有一行显然表明一个人还没有投票。