V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
libasten
V2EX  ›  数据库

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

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

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

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

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

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


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

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

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

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

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