V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
libasten
V2EX  ›  数据库

你们现在设计系统数据库的时候还在数据库层面搞外键约束吗?

  •  
  •   libasten · Mar 23 · 3431 views
    This topic created in 47 days ago, the information mentioned may be changed or developed.
    手里一个项目升级,数据库稍有变动,ai 帮忙的,给加了外键,然后它自己老是迁移升级过不去,外键校验卡住了。
    然后我就问了下其他 ai 。
    回答有点意思。

    ## 豆包
    可能是互联网短平快开发的代表?主要意见是不要数据库层面搞外键,会给数据库维护带来麻烦,比如之前遇到的外键校验之类的,强烈建议我在业务逻辑中做校验限制啥的。

    ## qwen
    他家是不是金融类工业类的用语料多?和豆包不一样,强烈建议我在数据库层面就加上外键,除非是经常发生上亿级别的数据库变动啥的,会影响效率,否则都建议做外键。
    30 replies    2026-03-24 12:29:36 +08:00
    Mithril
        1
    Mithril  
       Mar 23
    要么开始就加,要么一直就不加。

    从头搞项目的话,看数据类型。数据量预期不会特别大,而且对数据完整性要求比较高的,肯定还是加。其他数据量比较大的东西,比如 xx 记录这种,就尽量搞一张扁平大表,方便后续拆出去,上队列或者缓存,或者 OLAP 等其他的服务。
    mqnu00
        2
    mqnu00  
       Mar 23   ❤️ 1
    不上,有额外开销
    urlk
        3
    urlk  
       Mar 23
    从来没用过外键, 互联网行业需求变化快, 甚至表结构都经常改来改去, 上外键不是自找没事吗
    JoeDH
        4
    JoeDH  
       Mar 23
    从来不用
    whoosy
        5
    whoosy  
       Mar 23
    从来不用物理外键
    wogogoing
        6
    wogogoing  
    PRO
       Mar 23
    在业务/代码层面做关联约束。
    woodfizky
        7
    woodfizky  
       Mar 23
    不做。
    你正文里这个例子就已经说明外键的问题之一了,遇到数据库迁移或者在现有表上改设计的时候外键要让你头疼死。
    性能也不太好。

    ORM 可以加虚拟外键。或者你自己写业务查询的时候自己 join 一下就好了。
    opengps
        8
    opengps  
       Mar 23
    不做,将来如果有调整会容易一大截,这种调整不光是不合理,也包括业务做大了的分裤分表分布式
    htxy1985
        9
    htxy1985  
       Mar 23
    早在 200x 年都已经定下的策略,从不用。
    justNoBody
        10
    justNoBody  
       Mar 23
    除了最早 oracle 的项目外,从来没加过外键
    yinmin
        11
    yinmin  
       Mar 23 via iPhone
    不做外键约束,这货会害死运维的
    Plating
        12
    Plating  
       Mar 23
    不加,DBA 和公司规范也早就不推荐了
    Felldeadbird
        13
    Felldeadbird  
       Mar 23
    我不会用,有时候删数据要把其他地方也清掉,很烦。
    新项目交给 AI ,AI 很喜欢用。
    iamzcr
        14
    iamzcr  
       Mar 23
    不搞外键约束,没有专业的 DBA,后面维护贼麻烦,直接程序上处理,利用事务。
    realpg
        15
    realpg  
    PRO
       Mar 23
    一般不搞, 偶尔搞, 外键主要用于自动 cascade 清空关联数据 不用其他功能
    LeegoYih
        16
    LeegoYih  
       Mar 23


    前阵子和一个玩游戏认识的老外朋友一起开发一个工具,我主导设计表结构和接口,我就按照肌肉记忆理所当然地没有加外键。

    结果他看完表结构后问我:不是哥们,你的表之间明明有关联,为什么不定义外键?
    我解释说:不加外键写入性能更好,在我们这绝大多数项目都是不加的,加外键的反而才是少数。他表示惊了。
    pulutom40
        17
    pulutom40  
       Mar 23 via iPhone
    这得看你用什么数据库,mysql 外键跟狗屎一样,所以大家都不用。换 pg 会好很多。

    过内互联网公司都是用 mysql ,因此大家都不加外键。而海外公司人手 pg ,因此都会按关系型数据库的原本用法来使用
    back0893
        18
    back0893  
       Mar 23
    不加 鬼知道产品咋个改 运维?那不是开发自己
    lucays
        19
    lucays  
       Mar 23
    肯定不加吧,qwen 有问题
    tianjiyao
        20
    tianjiyao  
       Mar 23
    我用 pgsql AI 都是会加外键的啊。。
    snw
        21
    snw  
       Mar 23 via Android
    ERP 系统之类五年十年稳定不变的加(基础字段),各类分析系统整天变动的不加。
    loading
        22
    loading  
       Mar 23
    数据库考试的时候要加

    生产环境,在代码里面搞定关系,数据库用事务保证,begin commit
    526326991
        23
    526326991  
       Mar 23
    面向项目开发 不用❎
    面向模型开发 用✅
    底层开发 需要
    业务开发 不要
    cutiechi
        24
    cutiechi  
       Mar 23
    开发的时候用,上线全删了
    Rache1
        25
    Rache1  
       Mar 23
    本来以前都不加的,最近这个项目有,又给加上了,用起来也不错,没那么不堪,主要是用来联动删除数据之类的。
    richarddingcn
        26
    richarddingcn  
       Mar 23
    线上业务设计 db 都不考虑 normalization 的 上啥 fk
    agmtopy
        27
    agmtopy  
       Mar 23
    不搞,金融系统都从来不搞,麻烦
    wzw
        28
    wzw  
       Mar 23
    如果 PostgreSQL + GORM ,是不是最好的:
    在 GORM 配置中开启 DisableForeignKeyConstraintWhenMigrating: true ,抛弃物理外键。

    这样?
    oed
        29
    oed  
       Mar 24
    想起电工,老师傅带小师傅,电灯接线要不要关总闸,原则上是需要的......
    abc0123xyz
        30
    abc0123xyz  
       Mar 24
    不搞,田园敏捷开发搞这个就是作死。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   938 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 150ms · UTC 19:46 · PVG 03:46 · LAX 12:46 · JFK 15:46
    ♥ Do have faith in what you're doing.