[讨论] 大家的项目中会使用外键约束吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hubianluanma
V2EX    数据库

[讨论] 大家的项目中会使用外键约束吗?

  •  
  •   hubianluanma 3 天前 3187 次点击

    从事程序员工作一开始,公司的开发规范就参照阿里的开发规范,其他不说,这次就说说不使用外键,而是用代码逻辑处理相关约束这个事情吧。

    我觉得阿里有这样的规范应该是考虑到服务多,分库分表下外键基本上不可用了,但是当涉及体量不大,即使是多服务,但是也没有到分库分表的情况,那这种情况下我觉得使用外键还是不错的,当删除和更新是就不需要开发人员去考虑写逻辑,只要前期表设计的合理,这些容易让开发人员忽略的事情就可以交给数据库去做了。

    我最近在做自己的一个小项目,我开始从头捡起了多年未使用的外键,因为我不需要考虑分表,这种情况下写代码真的省心好多,以前在写删除或者更新的时候还得自己考虑到位,保证不出现 “孤儿数据”,现在根本不需要。

    不知道大家平时会给自己的项目使用外键吗?如果不使用是为什么?如果使用了你觉得带来的开发收益大不大?

    32 条回复    2025-11-03 17:57:35 +08:00
    keer
        1
    keer  
       3 天前
    基本上不用。就算用了,代码也要做一下。 所以干脆不用了

    不过现在如果 AI 帮我把表建好了,给的 sql 有就用,没有就不用。
    SayHelloHi
        2
    SayHelloHi  
       3 天前
    看到老外的项目 里面好多 FK
    qviqvi
        3
    qviqvi  
       3 天前
    可以用,不会太影响性能
    leoding
        4
    leoding  
       3 天前
    目前主要是数据库设计阶段做 ER 图时会加入外键,方便确认表之间的关系,但是在导出建表语句时会忽略外键
    MIUIOS
        5
    MIUIOS  
       3 天前
    多此一举的东西
    ragnaroks
        6
    ragnaroks  
       3 天前
    自己的项目会用,用性能降低换满足洁癖和无后顾之忧;公司的项目不用,说不定明天就改需求了
    w568w
        7
    w568w  
       3 天前   2
    用。

    早期不用外键的原因:

    1. 和其他功能不兼容,例如分片(驳斥:很多问题只在早期 MySQL 中存在,PostgreSQL 大概率并没有相关问题)

    2. 影响性能(驳斥:对性能影响很小。而且如果真的存在某条高频语句,你确保不会出现问题,希望外键不要做无用的检查,现代数据库都允许你针对这单条语句禁用一致性检查,从而保持性能。另外,外键约束也会帮助某些连表查询的自动优化,实际上可能有助于提升性能)

    3. 人工维护数据时必须停机(驳斥:对整个数据库临时禁用一致性检查,就能在线维护数据)

    4. 外键功能太弱,不满足业务需求(这个完全看特定场景了,如果不能满足业务需求那没什么好说的)
    512357301
        8
    512357301  
       3 天前 via Android   2
    阿里的规范不一定适合所有公司,他们的体量普通公司达不到,他的规范很明显是把 MySQL 打平成普通的数据存储引擎了,摒弃了很多 MySQL 的特性,美其名曰提升性能。
    本质上是 RD 和 DBA 争话语权的问题。
    adoal
        9
    adoal  
       3 天前   1
    自从阿里系“毕业”的阿狗阿猫们进入传统行业信息化并拿到话语权之后……作为一个并不强势的甲方里的信息化工作人员,我已经绝望了。不接受也得接受,反正换谁来开发都这一股子把 100 个并发的业务系统当 100 万个并发的点赞系统来做的烂德性。
    adoal
        10
    adoal  
       3 天前
    @512357301 早期的 MySQL 里用各种所谓高级特性(其实就是特么的很标准的 SQL 特性)确实对性能影响比较大。现在的版本好一些,但也不一定。相对来说要用所谓高级特性还是选 PG 比较稳妥。
    yeqizhang
        11
    yeqizhang  
       3 天前 via Android
    不爱用,删数据太麻烦,一大堆的关联表,不设的话有游离的脏数据就脏数据吧。反正已经烂到根了
    AkinoKaedeChan
        12
    AkinoKaedeChan  
       3 天前
    神奇的 MySQL 外键会影响索引
    hubianluanma
        13
    hubianluanma  
    OP
       3 天前
    @adoal 嗯,虽然 mysql 没有给我带来多大的麻烦,但我已经开始逐渐开始使用 pg 来代替 mysql 了
    ChenSino
        14
    ChenSino  
       3 天前
    都是 sql 上手动写联表了,反正我从来没用过
    realpg
        15
    realpg  
    PRO
       3 天前
    mysql 项目 外键仅用于必须高强度自动 cascade 的场景
    june4
        16
    june4  
       3 天前   1
    月经问题来来回回的问,先接到需要有必要去掉外键这种白捡功能的大工程再考虑也不迟
    programMrxu
        17
    programMrxu  
       3 天前
    看使用框架吧,如果使用 Django 还是需要加一些外键的,如果使用 flask ,那其实加不加就无所谓了
    bronyakaka
        18
    bronyakaka  
       2 天前
    @programMrxu django 也不用给表加物理外键,模型定义下就行了
    lysShub
        19
    lysShub  
       2 天前
    高级特性都不用
        20
    yjxjn  
       2 天前
    阿里规范只适用于很典型互联网公司,而且业务不复杂(相对于传统制造业的业务来说)。
    外企路过,FK 必须用!
    yinmin
        21
    yinmin  
       2 天前 via iPhone
    不要用“外键约束”,否则项目做数据维护的时候,太麻烦了,数据库运维要疯掉的
    guiyumin
        22
    guiyumin  
       2 天前
    @512357301 其实这样 挺好

    而且甚至可以进一步裁减 mysql
    Lockroach
        23
    Lockroach  
       2 天前
    用 ORM 的话外键很方便,反正也没有百万级用户,爱怎么来怎么来
    programMrxu
        24
    programMrxu  
       2 天前
    @bronyakaka 模型定义了物理外键,在迁移数据库的时候,就会生成表外键了。
    bronyakaka
        25
    bronyakaka  
       2 天前
    @programMrxu #24 模型可以指定参数,不会生成
    lyxxxh2
        26
    lyxxxh2  
       2 天前
    不用,单纯嫌维护麻烦。
    至于孤儿数据,存在就存在呗,没强迫症。
    lyxxxh2
        27
    lyxxxh2  
       2 天前
    @bronyakaka
    你们把"外键"和"外键约束"当作同个东西了?
    bronyakaka
        28
    bronyakaka  
       2 天前
    @lyxxxh2 #27 题目问的就是外键约束,我讨论的不也是这个吗?
    back0893
        29
    back0893  
       2 天前
    不会用 db 的约束 基本没有用过
    loloX
        30
    loloX  
       2 天前
    早期做项目用过,后来有了 ORM 基本就没用过了。作为程序员,还是很希望这些约束都在一个地方管理。
    guanguanupup
        31
    guanguanupup  
       2 天前
    从来没用过,有关联字段就行了
    UN2758
        32
    UN2758  
       1 天前
    写 web crud 的同学,假如并发体量低于 1000qps,用外键在遇到关联查询不是省心很多吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5296 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 08:38 PVG 16:38 LAX 00:38 JFK 03:38
    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