数据库字段名下划线法还是驼峰法好一些? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jry
V2EX    Java

数据库字段名下划线法还是驼峰法好一些?

  •  
  •   jry 2020-03-05 19:25:06 +08:00 13492 次点击
    这是一个创建于 2045 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前一直使用 thinkphp,没有 Entity 这回事,最近研究了 spring-boot,发现 Entity 的把字段映射定义成驼峰法通过注解来对应具体的下划线字段名称: 1、这样是否会有性能损失,要不要直接数据库字段改成驼峰法? 2、之前的系统是 php 的,想直接把后端改成 java,但是兼容原来的数据库,php 版本的后端返回比如文章信息时是直接 json(字段下划线法),那 java-jpa 有办法再输出 json 时再把驼峰法转换成下划线吗?还是直接方案 1,直接统一全局驼峰法?

    39 条回复    2020-03-08 15:57:42 +08:00
    janwarlen
        1
    janwarlen  
       2020-03-05 19:34:40 +08:00
    数据库不要用驼峰,驼峰一般只是针对代码的规约

    用,两者都可以用,个人从可读性是数据库使用下划线
    hantsy
        2
    hantsy  
       2020-03-05 19:42:19 +08:00   2
    一般都是用 Snake 比较多。Camel 方式会很多问题,特别一些系统处理不分大小写,有的语言或者框架已经加入大小写检测。

    SQL 关键字大写:SELECT * FROM posts, 函数小写:SELECT now()
    数据库一些命名我倾向于小写,posts(表名复数化),first_name, product_id (某表字段名)。当然 Oracle 用户好像一直喜欢全部用大写的。
    mesbbs
        3
    mesbbs  
       2020-03-05 22:15:36 +08:00
    表名下划线,字段名全大写
    Kontinue
        4
    Kontinue  
       2020-03-05 22:18:43 +08:00
    都支持的,输出 json 时再把驼峰法转换成下划线,这个可以用 fastjson 配置注解。一般来说,java 多用 mysql 吧,mysql 里数据库字段是下划线的,JPA 自动能映射成驼峰的。
    saulshao
        5
    saulshao  
       2020-03-05 22:30:05 +08:00
    我一般都用下划线。
    lc7029
        7
    lc7029  
       2020-03-06 02:55:50 +08:00
    汉字数据库名,汉字表明
    没见有问题,而且更直观
    lookas2001
        8
    lookas2001  
       2020-03-06 04:15:02 +08:00
    数据库 snake,后端 camel,接口 snake,前端 camel,多麻烦。
    我的话直接全部 camel,省心省事。
    sutra
        9
    sutra  
       2020-03-06 07:33:38 +08:00
    用下划线还是用驼峰,是编码规约决定的。
    数据库一般都是用下划线。
    chendy
        10
    chendy  
       2020-03-06 08:15:37 +08:00
    数据库用 snake,用 camel 可能会遇到一些大小写不敏感导致的问题
    至于代码 camel,数据 snake 的情况,一般都有单独的配置(比如 jackson 和 jpa 的 namingstrategy )做全局改名不需要挨个配置
    murmur
        11
    murmur  
       2020-03-06 08:55:12 +08:00
    对于行业软件其实中文命名真的是最省心的
    NoKey
        12
    NoKey  
       2020-03-06 09:18:57 +08:00
    数据库里不用驼峰,用下划线,代码里用驼峰,各框架基本也是这个规约
    csulyb
        13
    csulyb  
       2020-03-06 09:28:35 +08:00
    建议下划线,曾经 mysql 迁移到 pg,大小写出了一堆 bug 因为 SQL 语句是不分大小写的 但是 pg 里对大小写是敏感的 很多代码要改
    passerbytiny
        14
    passerbytiny  
       2020-03-06 09:33:28 +08:00
    1、没有性能损失,不管哪种 Java 服务器,都是要先启动容器才能 提供服务的,而容器是会缓存各种配置的。
    2、如果你们的数据库够理想,那么 jpa 那里啥也不用动,你要动的是 spring mvc 那里配置一下 json 解析。但是,你们以前都没 Entity 这回事,那么 jpa 跟数据库的映射,八成很难做。这种情况的最佳建议是:后端完全重做,数据库重做并迁移数据,前端调整 json 规范。说句实在话,只是后端部分 PHP 换 Java,九成九都是坑。假如 PHP 三周就能做完的项目,这三周的时间就够 Java 配置一下开发环境。
    itechify
        15
    itechify  
    PRO
       2020-03-06 09:39:54 +08:00 via Android
    springboot 的 json 默认库应该是 Jackson,前端返回 json 的 key 可以配置为 snake 风格。只需要在返回前端的 VO 类配置对应策略。搜索一下吧
    xnode
        16
    xnode  
       2020-03-06 09:56:48 +08:00
    我都用下划线
    hbolive
        17
    hbolive  
       2020-03-06 09:59:49 +08:00
    如果实在纠结,用中文吧。。
    WeeH9T
        18
    WeeH9T  
       2020-03-06 10:01:26 +08:00
    推荐全部使用下划线。兼容性更好

    实际项目中遇到过 mac 访问 mysql 一个返回表名大小写不匹配的问题

    information_schema.tables in name,当 name 长度为 1 时,返回小写,大于 1 时,返回大写。

    我当时是蒙蔽的
    aydd2004
        19
    aydd2004  
       2020-03-06 10:13:06 +08:00
    所有代码 不管啥语言 都特么下划线
    rogerus
        20
    rogerus  
       2020-03-06 10:17:06 +08:00
    数据库用下划线好一些,否则大小写问题逼疯你。
    optional
        21
    optional  
       2020-03-06 10:21:06 +08:00
    pg 大小写不敏感,所以我选择不给自己找麻烦。
    lcf0030
        22
    lcf0030  
       2020-03-06 10:26:49 +08:00
    _
    ccl945
        23
    ccl945  
       2020-03-06 10:27:34 +08:00
    @lc7029 原来那个表字段用中文的是你
    SheepM
        24
    SheepM  
       2020-03-06 10:28:59 +08:00
    并不建议用驼峰式,因为 oracle 数据库和 mysql 数据库有一些大小写方面的差异,mysql 大小写敏感,但 oracle 的命名统一都是大写,有一天如果需要将 mysql 数据上的表和存储过程切换到 oracle,用驼峰式会直接原地爆炸。驼峰式一般用于在代码中,但不适用于关系型数据库代码
    edk24
        25
    edk24  
       2020-03-06 11:50:11 +08:00
    推荐用中文字段 啊哈哈哈哈
    hantsy
        26
    hantsy  
       2020-03-06 14:25:26 +08:00
    @csulyb 我以前一次经历,MySQL 在 Windows 下默认大小不敏感(可以修改配置),到部署到 Linux 就有问题了(字段,表名大小敏感),很多人程序里面 SQL 根本没在乎大小写。现在新版本怎么处理的,就不知道了。

    有时写一些 POC,省事一点我有时也不在乎这些规则,数据库可能也和程序一样用 Camel。最近用了下 PostgreSQL (跑在 Docker 里面), 用 Helidon DBClient 访问结果是,如果用 CamelCase 的话,DbRow 读出来的字段全部变成小写。
    yinzhili
        27
    yinzhili  
       2020-03-06 14:28:19 +08:00
    数据库表名、视图名、存储过程名、函数名、字段名都建议用下划线法
    wozhizui
        28
    wozhizui  
       2020-03-06 14:33:52 +08:00
    @hantsy 行家啊,学习了。
    jzmws
        29
    jzmws  
       2020-03-06 16:14:28 +08:00
    推荐用下划线, 因为数据库可以设置不区分大小写 , 我就吃过这个亏 , 之前一个不区分大小写的,然后再 java 用小写,生产数据库是大写,区分大小写 ,然后我就 gg 了
    lucifer1108
        30
    lucifer1108  
       2020-03-06 16:16:36 +08:00
    @mesbbs 那还有可读性?
    Vegetable
        31
    Vegetable  
       2020-03-06 16:20:55 +08:00
    我这种数据库字段用中文名的是少数吗?如果我认真对待一个项目,数据库字段名一定是中文。
    jin7
        32
    jin7  
       2020-03-06 16:31:01 +08:00
    中文最省事了 不费脑子 不存在大小写问题
    jry
        33
    jry  
    OP
       2020-03-06 16:41:35 +08:00 via iPhone
    @aydd2004 ENTITY 没法下划线
    jingege
        34
    jingege  
       2020-03-06 16:45:13 +08:00
    必须下划线呀,很多时候 MySQL 并不区分大小写吧
    qile1
        35
    qile1  
       2020-03-07 00:03:27 +08:00 via Android
    @yinzhili 最近听说 oracle 的包执行的时候要把.换成_,比如执行 packs.fac ()要写成 packs_fac ()
    yinzhili
        36
    yinzhili  
       2020-03-07 09:20:58 +08:00
    @qile1 新的版本改了吗? 11g 还是用.来分割
    ZoR
        37
    ZoR  
       2020-03-07 16:11:31 +08:00
    推荐下划线,以后遇到换数据库 大小写敏感 兼容性问题 就等着哭吧
    james122333
        38
    james122333  
       2020-03-08 15:48:47 +08:00
    能的话我几乎所有东西都不想要驼峰 很容易误打的方式
    james122333
        39
    james122333  
       2020-03-08 15:57:42 +08:00
    还有都大写也是很奇葩的
    对于大小和小写当然是小写看起来比较不吃力 也比较美观
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5506 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 08:40 PVG 16:40 LAX 01:40 JFK 04:40
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86