请问什么时候会允许数据库字段 null

2018-12-28 15:21:04 +08:00
 luosuosile

最近在设计数据库,我基本全部数据都不允许 null,然后可能为 null 的,我都给了默认值“无”用的中文,,请问这样的操作会不会无意中给自己挖了坑呢?

3193 次点击
所在节点    问与答
29 条回复
codingadog
2018-12-28 15:39:13 +08:00
你这字段全是 varchar ?
真有个值就是“无”进来你咋办
night98
2018-12-28 15:41:06 +08:00
很多人分不清楚“”和 null 的区别也就算了。。。还有人设置为无的。。。
l00t
2018-12-28 15:41:54 +08:00
你不如问什么时候不允许数据为 null。当你想不出什么理由不允许的时候,那就允许为 null
mahone3297
2018-12-28 15:43:12 +08:00
我觉得会
luosuosile
2018-12-28 15:49:44 +08:00
@codingadog 好像有道理
libook
2018-12-28 15:52:24 +08:00
1. 以后不会把“无”当做非 null 的情况来用。
2. 不需要判断是不是“无”值。

业务符合上述条件的话,我觉得这么做也挺好的,前端不需要再判断是不是 null 然后重写成“无”展示出来。
但如果前端需要判断“无”的情况,比如有个按钮,如果字段为“无”就把按钮禁用,这样用 null 可能更好一点。
sun1991
2018-12-28 15:56:18 +08:00
一般能非 null 就不要允许 null. 随意允许 null 会给以后带来麻烦.
null 就相当于一个缺省值. 如果什么值都不合适做缺省值的情况下, 那也只能允许 null 了.
luosuosile
2018-12-28 15:56:24 +08:00
@codingadog 我这里是在微信号和班级,这两个字段设置了,默认无,因为不是所有人都有微信号。暂时应该不会发生你说的情况,但是你说的情况是值得考虑的
luosuosile
2018-12-28 15:58:30 +08:00
@sun1991 对,我就是这么想的,所以基本都不想允许 null,但是有的字段我认为业务会出现空值的情况,我就想给个默认值,看看能不能避免掉允许 null。感觉英文和中文也没什么所谓,因为开发我肯定全是中国人,就默认了'无'
luosuosile
2018-12-28 16:01:31 +08:00
@libook 你说的很有用,应该不会出现这种情况,我还需要再考虑考虑
mxalbert1996
2018-12-28 16:06:14 +08:00
@l00t 我觉得如果没有特别的需要 null 的理由的话就不要允许 null,毕竟对性能也是有影响的,用空值就好
luosuosile
2018-12-28 16:08:48 +08:00
@mxalbert1996 嗯,允许 null 好像每行多占用一个字节,而且对这个值建索引也要多一个字节。并且有 null 值的列走索引好像更不舒服。所以数据量大了,感觉影响还是比较大
l00t
2018-12-28 18:40:49 +08:00
@mxalbert1996 #11 什么性能问题?
l00t
2018-12-28 18:45:45 +08:00
@luosuosile #12 你在说什么鬼……不同数据库有不同的处理方式,就是同一个数据库比如 MySQL,不同的引擎也有不同的做法。因为性能调优之类的原因而做取舍不是不可以,但要建立在你确定知道你在做什么的前提下。如果不清楚不知道,那就不要想太多,尽量使用和发挥特性来满足业务需求才是优先。
mmdsun
2018-12-28 18:54:10 +08:00
我对网上传闻表示质疑。一直以来都有说 MySQL 不适合用 null 用“”来代替。

mysql 文档上有写对 is null 查询有额外的优化。


那么 where 字段=“”这样真的比 where 字段 is null 查询要快??

如果一个表的字段,有 10%数据的可能是空的。用“”还是 null 好?,如果 80%都为空:是用“”还是用 null 好?
mmdsun
2018-12-28 18:56:19 +08:00
如果是数值呢?楼主是默认返回 0 么?

假如字段是考试成绩。
0=0 分
null 等于没有考试
还是有区别的
msg7086
2018-12-28 19:00:33 +08:00
@luosuosile NULL 和'NULL'是两回事啊。
微信号不允许中文这也就算了,如果某个字段里「无」是合法值怎么办。
而且假如你的业务要求微信号需要唯一索引怎么办?你给每个无都加上小尾巴吗。

真要说性能调优,请拿实际性能测试说话。这个索引会产生多大的性能损失,修改后是否有性能改善,改善有多大,是否值得牺牲数据正确性来换取这个性能调节。

NULL 原本的用途是表示一个值未提供。对于微信号这种字段,如果用户没有填写,那么 NULL 就是最适合的表达了。空字符串、默认值等实现方法一样有上面的唯一索引冲突问题。

如果理解上有困难,可以换个思路去理解:NULL 不是一个值,NULL 是没有值,NULL 不是缺省值。
momocraft
2018-12-28 19:03:24 +08:00
"无" 还不够坑,还可以根据用户 locale 返回 "冒得" "nil" "某" 等
lanterboy
2018-12-28 19:23:35 +08:00
@momocraft #18 你是魔鬼吗
passerbytiny
2018-12-28 19:26:50 +08:00
Boolean.true, Boolean.false, <Boolean>null,是 Boolean 变量可能有的三个值,请问楼主此时怎么表示第三个值。
再来个贴近现实的,楼主准备怎么表示一个人一次考试是否及格的全部情况—及格、不及格、没考试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/521911

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX