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

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

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

10812 次点击
所在节点    问与答
107 条回复
AhogeK
2021-04-15 17:27:36 +08:00
不过改得是没数据的表 而且也不用动代码 也没有代码只有 mpg 生成的简单 crud 被说的话就像大家说我的那样 呜呜呜 别骂了别骂了 代码的话提议了阿里规范扫描倒是接受了 数据库改善还有待商讨,固定的几个字段上一家公司就是阿里规范的,比如表达是与否概念的字段,必须使用 is_xxx 的方式命名,但这家公司比如删除 deleted 不过也接受 创建时间跟更新时间用的 create_date 跟 udpate_date 也没事,创建者用的 creator 也没事,更新者直接来了个 updator ?数据库里字段类型我可啥都没改 比如时间用 datetime 不用 timetimestamp
eric96
2021-04-15 17:46:32 +08:00
这个数据库字段命名,真的,快跑
ashuai
2021-04-15 18:11:09 +08:00
这谁顶得住?赶紧跑

被同化后你想找下份工作就难了
isnullstring
2021-04-15 18:19:55 +08:00
弄默认值 其实很正常,也很应该
但是之前没整,那就不要多手去加,吃力不讨好

V2 和知乎也经常看到问,为什么上一任程序员看到垃圾代码不去优化
有些代码是用时间、用钱逐个坑填上,你看到的只是最终结果
GGGG430
2021-04-15 18:20:01 +08:00
@wakzz 空字符串占用空间? 你是百度的吗?
另外, 你说规范是人定的, 我们就可以随意更改规范, 然后跟着自己的感觉来, 然后公司里面员工 A 用 null, 员工 B 用'', 这是你说的让业务更简单了?
optional
2021-04-15 18:27:36 +08:00
人云亦云的孩子
chrosing
2021-04-15 18:31:04 +08:00
跑~
redtea
2021-04-15 18:31:51 +08:00
性能和程序运行正常哪个重要?项目还没吃透就敢动手?改了以后有没有回归测试?最关键的是为什么改之前不问一声?
joesonw
2021-04-15 18:35:19 +08:00
run forest, run
Tumblr
2021-04-15 18:42:30 +08:00
首先不管别的,单是你这行为,如果是在我的团队,第一我会赶紧让人把数据库密码改了,并且不能让你知道;第二把你手上的关键任务转给其他人,给你些不那么重要的东西。。。
dqzcwxb
2021-04-15 18:50:07 +08:00
@wakzz #33 避免二义性比规范要重要一万倍
dzdh
2021-04-15 18:53:10 +08:00
@GGGG430
咨询一下,那允许为 NULL 是什么场景。
Narcissu5
2021-04-15 18:54:01 +08:00
@wakzz 但是对于非空的字段而言,这个 1bit 就是完全多余的。如果列大部分值都是非空,NULL 就是更费空间。如果大部分字段都是 NULL,那么这个表的设计很可能有点问题
limuyan44
2021-04-15 18:54:09 +08:00
良心劝告一下,就算之前的设计是一坨屎,你这行为也是大忌,可能严重到想开除的地步。
Fule
2021-04-15 19:20:59 +08:00
对于是否设置为可空,我觉得关键不在于是否浪费空间,是否影响索引,使用是否方便。关键在于这个字段的**语义是否可以有、“未知”、“未设置”的含义**。

比如“生日”这个字段,如果是在一个存放“出生婴儿”的表里,那么这个字段就应该是不可空的,因为出生婴儿必然有个出生日期(生日)这个逻辑没问题吧。

再比如“成绩"字段, 0 和 空 是不同的概念,空代表“未知”、“未设置”,0 代表有成绩,就是 0 分。所以如果表里的成绩允许有“未知”、“未设置”这个概念的话,应该设置为可空类型。而不应设置为不可空类型,默认值 -1 之类的。
此例中如果设置不可空默认值-1 的问题在于,数据必须在某个层级将 -1 转化为 “空”才能展示到界面,而用户在界面上未显式设置时又要将“空”设置为 -1 再保存,繁琐而现实意义不大。
wakzz
2021-04-15 19:31:37 +08:00
@zengming00 不用觉得,我看过底层数据实现结构,允许 null 值的列,都有一个比特位值来表示该列的值当前是否是 null 。
wakzz
2021-04-15 19:37:20 +08:00
@GGGG430 我看过 innodb 的底层文件结构,空字符串的值本身不占用空间。但例如 varchar 等变长字段,都需要一个字符长度值来让程序知道该变长字段的字节长度。这个字符长度值本身占 1 到 2 个字节,而空字符串的字符长度值占用 1 个字节。
另外,我指的规范是人定的意思,不是说完全不用遵守规范,别非黑即白。而是按照实际的业务情况和历史原因,定义符合自己实际情况的规范。你这所指的完全没有规范就离谱了
wakzz
2021-04-15 19:39:00 +08:00
@dqzcwxb 是的,业务比性能更重要,默认非 null 值尤其是数值类型的 0 值在很多场景非常容易出现歧义。
wakzz
2021-04-15 19:40:56 +08:00
@Narcissu5 1bit 真的可以忽略不计,与其讨论空间浪费,不如更关注 null 值、0 值和空字符串会不会引起业务歧义的问题。
nthhdy
2021-04-15 19:47:37 +08:00
我觉得吧,只要不改完一上线都挂了,都有讨论的余地

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

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

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

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

© 2021 V2EX