请教一下关于 MYSQL,有一个订单的状态字段,用什么类型来设计比较好。

275 天前
 go522000
我现在数据库是使用 5.7 版本,但不熟悉 MYSQL ,所以习惯沿用以前旧的习惯。

以下为我的作法,感觉很不合理,希望学习一下。

比如:

state int ( 2 ) ,表示:0 待支付,1 已支付,2 已发货...6 交易完成

然后这个字段用 MYSQL 的注释把 123 这些表示什么注释好。

或者增加一个新的字段,把不同的状态的名字存储起来,比如:

state_value varchar ( 10 ) 。 用来记录状态的描述

大概这样设计。



然后就会遇到一些问题,假设未来增加一个备货中的状态,这个状态在 1 与 2 之间,就会很为难,那么在最后面增加一个 7 备货中,很奇怪的样子。

-----

搜索了一下,5.7 已经支持 JSON 格式了。

那么未来新的项目是否可以设计为:state json 这种类型,把状态 ID 与描述一起存进去,比如:{state:1,value:'PAY_SUCCESS',description:'已支付'}

类似这种方式?这样会不会在未来遇到排序很卡或者不好搜索之类啥的,影响非常大?

或者,是否可以升级到 8.0 版本,支持 ENUM 类型?

ENUM 索引会不会更快点?

数据库小白,求指点。
3791 次点击
所在节点    问与答
36 条回复
coolboys
275 天前
ENUM 或者其他
franchise
275 天前
学习学习
weiwenhao
275 天前
字符串+1 , 存英文状态,以后导出到 duckdb ,Excel 之类的做个分析都很方便。
yaott2020
275 天前
我们公司也是使用字符串做状态的
zbowen66
275 天前
@nzynzynzy #4 我也曾这么想过,但是没有这么干...
esee
275 天前
我用 10 间隔,tinyint 无符号,不过你只要没有代码洁癖,不直接操作数据库,其实数字多少没啥关系啊.
mark2025
275 天前
mysqler 总是各种鸡肋优化…… 包括不限于 tinyint ,tinytext ,int 保存时间(戳),where 条件顺序
mgzu
275 天前
投英文状态一票
至少我遇到过新需求要增加新的状态。。。
smlcgx
275 天前
来学习一个,感觉 tinyint 和 varchar 都可以吧,另外从业务上来说,加一个备货中也可以,以备将来真有大件商品要专门进口或者定制的,所以放在后面挺合理的
Rickkkkkkk
275 天前
用 10 - 20 这种

哪天中间多一个状态也灵活
lscho
275 天前
用 int 来代表状态就是上古时代留下的不符合现在时代的经验了,除了节省点存储空间其他的全是坏处。

用字符串我觉得最合适
zpf124
274 天前
我还是习惯用数值类型的,不过 varchar 也可以接接受,但数值类型我不会强制数值的大小与含义有关系,单纯是思考时候想到的顺序,同时用 char 或者 vchar 我也不接受写 "0001"、"0002"这种玩意,你这么写还不如用数值类型。


另外,不要给数值类型设置长度,因为 mysql 对数值类型设置长度没什么意义,底层存储该是多长还是多长只跟着数值类型 bit 、int 、long 的定义走不会看你设置的长度,只有显示的时候会给你截取一下。

我只有 tinyint(1) 的时候会设置长度,这是因为我们用的 orm 生成 bean 的时候默认可以将这个特殊类型识别为 boolean 的,8 之后我用的工具这里会 warning 让我用改 bool 类型,目前还没改,因为我还需要和别人统一,包括 json 类型,虽然数据库支持了但我们开发手册没改,所以我实际还是用的 text 。
cumt21g
274 天前
用文本类型更好,免得注释,一看就知道什么意思
3IOhG7M0knRu5UlC
274 天前
tiny ,不在乎数字大小,代码里转枚举
shuang
274 天前
数值类型,省空间,性能也更好
vZexc0m
274 天前
数据库存字符串,代码里面使用枚举

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

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

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

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

© 2021 V2EX