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

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

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

3211 次点击
所在节点    问与答
29 条回复
rogwan
2018-12-28 19:47:28 +08:00
没有必要矫枉过正。这个值本来可能有,可能没有,不用找一个符号去代表没有,Null 自己代表没有完全没有问题。
Leigg
2018-12-29 09:04:56 +08:00
一般可以用空串表示 null,除非场景特殊,我认为你的场景是可以这么做的,微信号为空串不就代表没有提供吗。
luosuosile
2018-12-29 09:49:17 +08:00
昨天直到下班都没多少回复,今天一上班看到 16 条很是高兴,V2 确实给了我一个解惑的平台,这么热心的 v 友,百度是找不到的,google 又太吃力了。
luosuosile
2018-12-29 10:12:18 +08:00
前提还是说明一下吧,我是个一年菜鸡,这是我第一次主力设计数据库,虽然产品要求其实不是很高,但我认为是个宝贵经验,想要尽量做到尽善尽美。
那么我先来解释一下我为什么会这么做,又为什么会产生疑问,事先说明一下,我这个做法不是百度得来的,也不知道有人用“”来代替 null,这种做法快或者不快。“”,和 null 我的理解仅止于空字符串和没有插入数据,能听到大家的理解我也很开心。

我会这么做,是因为对《高性能 mysql 》这本书稍微认真的读了一遍,于是参考这本书进行数据库设计。但是苦于没有经验,理解仅止于表面,而不知道实际是怎样的,
我并不是想拿书名,背书来反驳各位,只是想解释一下我为什么这么做,不想大家觉得我是个百度就完了的 boy。
里面有一个简单的原则:
“尽量避免 null ”,实际上内容不翻书我也记不得,只记得作者确实很强调,如果不是真的需要 null,就不要允许 null。
刚好之前帮朋友进行了下数据库优化,虽然是菜鸡互啄,但效果还是有的,从 4 分钟变成了 3 分钟,大概设计的人是个更大的菜鸡,因为他的公司是个外包公司。。这里主要时看到他的语句中有大量的 isNull,和对“”的判断。觉得很难受,在想自己能不能尽量避免这种情况。
刚好业务就来了,未必能传值进来,与其放着 null,我在想放一个别的可能会更好,所以就有了这个问题。至于唯一索引
我确实没有想到,学习到了。


还有,对于这种优化有没有必要的疑问,诚然,为了提升那么一点性能而牺牲业务是很愚蠢的,而且我也不认为自己的数据量可能大到需要如此刁钻的优化,甚至随便搞搞都够用,只是我想做到尽量都能考虑到,,因为问题就在那里,放着我觉得不舒服。
luosuosile
2018-12-29 10:14:22 +08:00
还有对于上来就嘲讽的,我就是不懂才来提问的,你嘲笑一个本来就不懂的人不懂他的问题,我不知道有什么意思。
回复框右下角不是有“请尽量让自己的回复能够对别人有帮助吗”。
luosuosile
2018-12-29 10:28:24 +08:00
@msg7086 你说的有道理,我觉得很有帮助。
不如说,我想知道如果一个表非常大,性能要求高的时候,设计表对这个是否允许 null 是怎么处理的。
我的确知道自己的业务没有必要这么做。
确实如果对多种数据类型想表达这种思想,找不到一个统一的符号,分别给一个符号又太蠢,允许 null 确实是很好的做法。
msg7086
2018-12-29 11:07:34 +08:00
@luosuosile 如果是我来设计的话,语义正确性我是会放在首位的。
如果语义正确导致性能下降,那么我宁愿考虑从其他地方对数据库进行优化。
比如你已知某个查询会花掉三五分钟,那么首先这个查询本身能不能优化?能不能拆分成多句简单句?能不能把负载压力从数据库转嫁到应用程序端(以方便横向扩展)?能不能把查询的结果缓存进 Memcache / Redis ?
而且一个简单的 NULL (旗标)变成一个复杂的值(字符串),到底对性能有正面影响还是负面影响?直觉告诉我,这样的索引效率可能会更低。我一时想不出有哪个查询在这样修改以后会变快的。如果你有合适的查询语句的话,不妨贴出来大家一起研究一下。
micean
2018-12-29 13:21:09 +08:00
肯定挖坑,只要空字符串就行了
l00t
2018-12-29 23:18:03 +08:00
@luosuosile #26 说到性能就要说明具体的操作环境了。比如你用的是什么数据库(从你不经意的透露我推测是 MySQL ),什么引擎,表的数据量大小,查询的数据量一般在多少,需求的响应时间大概是什么级别。《高性能 mysql 》那本书我记得它紧接着就说把 NULL 列改为 NOT NULL 带来的性能提升很小吧? 另外说实话,它的这段描述到底对不对我都是很怀疑的…… 要考虑它的时代背景。你比如你说允许为 NULL 的记录占用空间真的会多些? InnoDb 里明显不成立嘛。假如你编码为 UTF8,一个“无” 占 4 个字节(3 + 1),一个 null 只占一字节,而且还能和其他 7 个 null 共享。

带 null 的列,我见过的主要顾虑大多是出于开发时对 null 判断的处理上的。很多人写着写着会忘了 is not null, is null 这种事,而一律用 大于小于等于,以至于踩到坑。另外就是玄学,“我也不知道为什么,反正不要用就是了”。

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

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

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

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

© 2021 V2EX