你们现在设计系统数据库的时候还在数据库层面搞外键约束吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
libasten
V2EX    数据库

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

  •  
  •   libasten 2 天前 2623 次点击
    手里一个项目升级,数据库稍有变动,ai 帮忙的,给加了外键,然后它自己老是迁移升级过不去,外键校验卡住了。
    然后我就问了下其他 ai 。
    回答有点意思。

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

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

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

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


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

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

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

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

    这样?
    oed
        29
    oed  
       1 天前
    想起电工,老师傅带小师傅,电灯接线要不要关总闸,原则上是需要的......
    abc0123xyz
        30
    abc0123xyz  
       1 天前
    不搞,田园敏捷开发搞这个就是作死。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1175 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 18:05 PVG 02:05 LAX 11:05 JFK 14:05
    Do have faith in what you're doing.
    ubao msn 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