数据库到底要不要外键

栏目: 数据库 · 发布时间: 6年前

内容简介:数据库的本质是存储数据,在这个之上还要维护数据的完整性。在维护完整性数据库提供几种方法,一种是事务,一种是外键 FK。这两种方式是分别处理两种情况,事务处理的是多个表中记录的原子性,FK 是处理多条有关系的记录。举个外键例子来说,假如有一个资源管理系统,你申请了许多资源,有电脑、账号、书籍、笔记本等好多东西,在你离职时候,这些记录需要全部删除,同时你的账号也要从这个系统中删除。这时候如果存在外键,user 表中的 id 字段关联了各种的资源 id,这时候需要一条 SQL 就可以删除这些记录。所以这么看外键貌

数据库的本质是存储数据,在这个之上还要维护数据的完整性。在维护完整性数据库提供几种方法,一种是事务,一种是外键 FK。这两种方式是分别处理两种情况,事务处理的是多个表中记录的原子性,FK 是处理多条有关系的记录。

举个外键例子来说,假如有一个资源管理系统,你申请了许多资源,有电脑、账号、书籍、笔记本等好多东西,在你离职时候,这些记录需要全部删除,同时你的账号也要从这个系统中删除。这时候如果存在外键,user 表中的 id 字段关联了各种的资源 id,这时候需要一条 SQL 就可以删除这些记录。

所以这么看外键貌似很有用,真实情况是真的很有用。但是我们从给一个角度来看,一条 SQL 需要级联多个表的操作,在 DB 引擎中可能同时需要多个行锁或者表锁,来保证完整性。同时还会会涉及到 IO 问题,我们都知道 IO 的随机读写其实是比较慢的,在访问频繁的的时候数据库往往不足以支撑那么大量的请求。

一般这种观点的人会给出以下几个理由:

  • 性能好
  • 修改开放,易于维护

坚持使用外键的人也有几个理由:

  • 数据完整性
  • 表结构清晰
  • 约束性好

无论怎么看都貌似很有道理,事实就是都对,但是要看在什么情况下使用,要从架构层面上取长补短。假如我们使用了无外键的设计,那么就要从架构补足缺点。举个例子来说,无外键设计一般会上移逻辑层到程序中,由程序要维护数据完整性,随着程序重启崩溃总是会出现一些游离数据。这些游离数据对系统究竟没有影响就很关键了,如果说这些游离数据不会影响系统正常运行,那么无外键的设计就很成功。典型的就是只需要根据 id 来获取某些数据,而不是通过某些条件来范围查询数据。

这个其实很好理解,对于只用 id 获取的数据我只要保证这个 id 有没有没有被删除就 ok 了,那些关联的数据在这个 id 被删除以后就再也无法被找到了。

如果说你正在做的是一个账号相关的系统,往往和账号相关的数据要求的完整性都很高,无法容忍出现游离数据,那么你只能使用外键来维护这种关系,虽然说上移到程序也能做,但是总不如数据库来的彻底。

对于访问量大的表来说,一般会对这个表分片处理,分片的原理是根据某个字段把数据分散到多个片当中,这时候外键就无法起作用了,对于互联网公司来说分片做的都很多,外键设计变得越来越少。精明的架构师会用各种方法来补足无外键的缺点。

总结一下,关于是不是要外键的回答可以肯定的是,要和不要都可以。具体要看业务如何拆分,数据容忍度有多高,以及架构师是否精明。如果以上没有一个,那么还是老老实实使用外键设计。


以上所述就是小编给大家介绍的《数据库到底要不要外键》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

维多利亚时代的互联网

维多利亚时代的互联网

[英] 汤姆·斯丹迪奇 / 多绥婷 / 后浪丨江西人民出版社 / 2017-8 / 38.00元

人类历史上的第一次大连接 回顾互联网的前世 预言互联网的未来 ……………… ※编辑推荐※ ☆《财富》杂志推荐的75本商务人士必读书之一 ☆ 回顾互联网的前世,颠覆你的思维,升级你对互联网的认知 ☆ 人类历史上一次全球大连接是维多利亚时期的电报时代,那时候也有疯狂的资本、 巨大的泡沫、网络新型犯罪、网络亚文化崛起……现在的互联网时代就是电报时代的重演;回顾那......一起来看看 《维多利亚时代的互联网》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试