因为把公司 Mysql 一堆带 null 字段优化非空带默认值被骂

2021-04-15 11:08:42 +08:00
 AhogeK

刚来一家新公司注意到数据库里新建的表有一堆 null 值的字段,想数据量大会影响索引,项目也刚开我就改了下,然后就被训了,就说别动数据库,非不非空让前端去判断(我就想是前端判断啊,但后端不也要校验,数据库只是优化查询)但我没之声 而且好多字段都是中英混用,可难受死我这强迫症了 比如父 id fid 组织类型 orglx 行政区划代码 xzqh 行政区域编码却是 adcode [捂脸.jpg]

12159 次点击
所在节点    问与答
107 条回复
xupefei
2021-04-15 20:02:37 +08:00
团队精神不足是一个大 behavioural flag,在面试中能直接枪毙了。
AEDaydreamer
2021-04-15 20:14:08 +08:00
这个变量名我看着血压都已经升高了,要是我在 design table 里看到一定会找建表的人说道说道
killergun
2021-04-15 20:23:23 +08:00
我上家公司单表接近一个亿的字段也是设置成 null
Seanfuck
2021-04-15 20:35:10 +08:00
我记得 null 和空值也是有区别的,null 不 null 是字段设计(程序)的逻辑,空不空是数据(用户)的逻辑,这样对不对?比如一个字段既要判断用户有没有改过,同时也给用户设置为空的权力。
makdon
2021-04-15 20:47:53 +08:00
新版本的 Mysql 的 null 用就是了
如果业务上面一个字段是可空且,那就应该设置为 nullable 的列
举个例子,有一列是采集用户的某个数据,假设是今天使用的电量吧
那未采集的状态就是 null,采集了一度电都没有用过就是 0,这里就需要显式区分没有采集的状态
当然你可以引入其它额外的标记位,或者引入 -1 类似的默认值
但是这样又会在求和求平均等场景引入额外的判断条件( where cost != -1)
最自然的做法我觉得还是让列为 nullable 就可以了

reference: https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html
wupher
2021-04-15 20:58:21 +08:00
同意 @makdon 的意见。

过早优化常常会带来其它的问题。除非这是张大表,有复杂的索引等等。

从设计本身角度,更推荐该空即空。

此外变更前与同事取得一致也是一种尊重。

但是,汉语拼音不能忍……估计我看到也会很难受。
xuanbg
2021-04-15 21:25:50 +08:00
null 都给改成非 null,然后给个默认值?换我也要破口大骂。我一个数值 null 表示无,你给我来个什么默认值? 0 还是-1 ?我告诉你,无论是 0 还是负数,在业务里面都是合法且正常的值。你给我把 null 搞成 0,实际上数据就被你破坏掉了,而且无法恢复。你说要不要骂你?
ReysC
2021-04-15 21:35:54 +08:00
如果是后端来和你讨论用不用 NULL,没啥问题,只是小公司没任何文档和说明就让你开始,他们的问题;
如果是前端和你讨论要不要用 NULL,建议立即跑路,估计这公司 CTO 都换了 N 个。
domodomo
2021-04-15 22:24:32 +08:00
还不赶紧换一家,作坊式的开发公司别呆太久
GGGG430
2021-04-15 22:36:14 +08:00
@wakzz 上一个回答说 char, 这个回答说 var char, 你在说啥呢, 知道"例如 varchar 等变长字段,都需要一个字符长度值来让程序知道该变长字段的字节长度"这就是看过 innodb 底层文件结构? 哪个版本的底层文件? 这和底层文件结构有啥关系, 你这不就是搜的八股文吗? 需要我给你加上 var char 的其他八股文吗, 比如 var char 还会保留末尾空格什么的吗
ajaxfunction
2021-04-15 22:36:56 +08:00
如果人家程序里有很多 sql 是 is null 或 not null ,你这一改,不就导致系统奔溃了吗?
无论代码质量咋样,起码目前已经是在跑业务的,你这一改就是人为制造 BUG 。
h82258652
2021-04-15 22:37:43 +08:00
虽然楼主改表字段为非 null 确实是不妥当,但是楼主描述的其它问题更严重,没有项目文档,全是口头沟通。
我以前就碰过一家,同一个需求,每次对方说都不一样的。这些东西应该形成文档固定下来的。
ihipop
2021-04-15 22:39:36 +08:00
是否允许 null 也应该看业务需求 /数据库特性而定,,null 和非 null 的默认值的业务区别一般也是是有的,一般引擎 null 也只是不参与索引,不影响非 null 索引。
wakzz
2021-04-15 22:46:36 +08:00
@GGGG430 基于的版本是 MySQL5.7 的 innodb,数据落盘后的 idb 文件。毫无实际应用价值的知识才是八股文,上面说 char 那是打快了
GGGG430
2021-04-15 22:54:53 +08:00
@wakzz 反手就是一句打快了? 算了看了很多层的回答, 都是跟着感觉走, 我行我素, 以遵守规范为耻, 真是服了, 我猜很多层都不知道 b+树是什么东西, 就在这根据自己的野路子经验乱回答
wakzz
2021-04-15 23:06:09 +08:00
@GGGG430 不是,建议你别把别人当傻子。网上非实名制所以吧友们想到啥说啥,论点碰撞什么的日常情况了,但这年头出来混的谁没有点东西,你猜很多层不知道 b+树就离谱了。。。笑
billlee
2021-04-15 23:11:34 +08:00
不要什么都不想就禁用 NULL. 有些字段就没有合适的值来表示空值,比如用 32 位整数存 IPv4 地址,那么显然每个数值都是有意义的,显然不能用 -1 或者 0 来做空值。

影响索引也不知道是哪来的以讹传讹的说法
MengiNo
2021-04-15 23:50:13 +08:00
如果 mysql 做了几十年连 null 都要用所谓的 “规范” ban 掉的话。哪里还要去考虑什么技术、底层、原理、实现,作为一个自然人最直观的印象和感觉难道不是,要么 mysql 项目组就应该当场解散、作者出来谢罪,要么他们立刻马上连夜光速出一个 patch 把 nullable 拿掉。既然这两种情况一直都没有发生,那么至少 mysql 官方对自己的 nullable 做的还挺满意的,那既然这个 feature 没有问题,有什么不用的理由。
littlewing
2021-04-16 00:03:06 +08:00
线上数据库是你能随便动的?动之前都不打个招呼!
有时候你觉得是错的东西,或者说确实是错的,但人家写代码已经将错就错了,你一改,影响到下游多少调用方你知道吗?
GGGG430
2021-04-16 00:59:06 +08:00
@wakzz 能说出“上面说 char 那是打快了”这话的人本身就是在把别人当傻子!

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

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

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

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

© 2021 V2EX