我知道这个问题在站内已经讨论过无数次了,比如 关于外键,为什么国内基本都不推荐使用,国外基本都推荐使用?,但是直到现在也没有一个帖子能够达成共识,所以就一些不明确的地方提出些问题:
首先说前提:
接下来是疑问:
出于以上几点疑问,我感觉逻辑外键相比物理外键来说毫无优势(包括性能优势,因为需要加锁),还很可能因开发人员水平不足、考虑不周或在直接修改数据库时写错脚本从而损坏数据,那么为什么仍有相当多的开发者认为多数情况下应该避免使用物理外键呢?
以下是一些个人的想法:
大厂全面禁止外键,一方面可能是由于核心业务对性能敏感而不使用,最后为了管理方便干脆全部禁止,我至今没能找到一个合理的全面禁止使用外键的理由,如果有大厂高层,希望可以听到你们的看法。
在设计阶段加入外键,一定程度上可以降低开发人员的编码负担,减少系统错误,哪怕是不会考虑并发状况或对数据库不熟悉的开发者,外键也能阻止他将错误的数据写入库中,反过来产生的「接口总是报错」、「导入顺序不对报错」等问题,我认为是合理且必要的错误提示,一个接口要做的应该是在数据不合规范时阻止其写入,而不是强行写进去。
另外还有一个相关但关系不是很大的问题:
说到外键就一定会说到关联,我注意到也有部分人反对在业务查询中使用 JOIN
,主要理由是 JOIN
的效率低下,关于这个问题,希望有熟悉数据库的人能为我解惑:
如果表设计合理,关联查询是否都可以通过索引优化到比多次查询并在内存中拼接的方式更快?
以上。请注意我讨论这些问题的前提都是设计合理,对于数据库本身设计就无法很好的支撑业务,导致经常需要走弯路解决问题的情况,不属于本帖的讨论范围。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.