Java enum 数据库存储问题(大家都是存字符串还是数值)

2020-09-25 18:11:12 +08:00
 sdbybyd

想问下大家怎么存储 enum 的,是字符串存储还是数值存储? 比如:

Gender { MALE, FEMALE }

5505 次点击
所在节点    Java
41 条回复
sdbybyd
2020-09-26 01:19:18 +08:00
@huijiewei 你这个做法应该不行,还不如手撸 converter
sdbybyd
2020-09-26 01:23:02 +08:00
@xiangyuecn enum 的好处很多,比如类型检查(不是 Integer 数值类型检查),如果你可以直接这么写

```java
public enum Gender {
MALE,
FEMALE;
}
```

而且有自动化工具帮你存储数据库时转换为数值存储,如 1,2,提取时自动转换,这种状态维护起来就简单多了

我想要的就是这种自动化工具(不用硬编码数值,看了一些 api,fb 和阿里就有这么搞)。
sdbybyd
2020-09-26 01:24:03 +08:00
@yiyi11 你说的数据库码表指的是?特定数据库类型?还是在 java 上编码的数值映射
sdbybyd
2020-09-26 01:38:43 +08:00
@MarioLuo 直接用字符串的话,作为索引的时候是不是太浪费了,有没优化方法
dswyzx
2020-09-26 02:06:32 +08:00
c#里,enum 是值类型,class 可是引用类型。根本性不同。enum 映射 db 当然是数值类型了。二楼说 bit 的,刚好性别男女是够用了,以后扩展人妖或者啥啥的时候你怎么存
MarioLuo
2020-09-26 03:44:14 +08:00
@sdbybyd 数据量不高的情况下索性性能差异不大, 而且大多数情况下枚举字段并不适合作为索引列
MarioLuo
2020-09-26 04:13:27 +08:00
@sdbybyd 枚举增加数值属性, 实现 IntCode 接口,然后为相关的库针对这个接口通用的转换器(mybatis, jpa, spring mvc,...)

enum Gender implement IntCode{
MALE(1),
FEMALE(2);
private Integer code;
public Integer getCode(){ return code; }
}

interface IntCode{
Integer getCode()
}
binux
2020-09-26 05:05:41 +08:00
数据库也用枚举类型不就完了
huijiewei
2020-09-26 06:40:53 +08:00
@zsdroid 不用 ENUM 是因为如果数据库里面有 ENUM 不存在的值。API 输出会很麻烦
huijiewei
2020-09-26 06:46:00 +08:00
@binux 因为大部分人用 mysql,mysql ENUM 类型坑比较多,现在都不推荐使用 ENUM
ez728s
2020-09-26 09:06:18 +08:00
ez728s
2020-09-26 09:12:24 +08:00
数据库里面应该存储有明确意义的字符串值而不是不知所谓的 1234 数值
xiangyuecn
2020-09-26 10:29:08 +08:00
@sdbybyd #22 解决硬编码数值(应该叫魔术数值)问题,应当首选常量,而不是 enum,比如 Android 里面的 startActivityForResult 中的 requestCode 这个反人类数值参数,用 enum 当然可以,但不会去用的,基本定义成常量的
zeroday
2020-09-26 10:58:04 +08:00
直接用 mysql 里的 ENUM 类型. 因为是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。
如果有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 。
yiyi11
2020-09-26 11:23:48 +08:00
@sdbybyd 数值映射
tailf
2020-09-26 12:00:14 +08:00
数据库不要用 enum,用 tinyint
skypyb
2020-09-26 14:16:29 +08:00
用 postgres 就没这破事了
notejava
2020-09-26 16:40:00 +08:00
字符串,可读性好
tairan2006
2020-09-26 17:22:20 +08:00
tinyint/smallint
sdbybyd
2020-09-30 12:03:59 +08:00
@MarioLuo 我们目前就是这么做的,但是还是需要定义数值,数值定义不好规范,想要数据库插入就是字符串(实际存储用的数值)这部分对开发者隐藏的同时规避 数据库 enum 类型的缺陷

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

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

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

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

© 2021 V2EX