转发自极光轻学,原文链接:https://jiguangqingxue.com/info/24

必须设置外键VS不要设置外键的争论

数据库表到底要不要设置外键约束,一直具有非常大的争议。我认为完全没有必要非黑即白,存在即合理。

这两种争论的产生根源在于它们都有各自的使用场景和理由,并不是纯理论的空想。

所以最好的方式是根据项目类型、业务场景进行决策,甚至可以两种方式混合使用,才是最好的。

例如对于证券、股票、保险、银行等金融行业,应该设置外键保证数据的一致性更加重要,而对于互联网行行业的衣食住行则可以采用无外键设计,追求更高的性能和更快的迭代速度。

数据库表不设置外键会有哪些问题

  1. 数据完整性问题
    缺少外键最主要的问题是数据库不能强制进行完整性约束检查,如果在业务程序中没有正确处理,则可能会导致数据不一致。例如银行、证券、保险等金融行业,每一个账户的金额都不能出错,一旦出现数据不一致就是灾难性的问题。
  2. 表之间的关系不清晰
    无法直接通过外键来梳理表之间的关联关系,对于新接触项目的人员会十分困难。对于一些大型的复杂项目,没有外键约束,梳理不清表之间的关系也是一种灾难。

如果数据库表不设置外键会有哪些好处?

  1. 对性能具有较大的提升
    在表上拥有活动的外键可以提高数据质量,但会影响插入、更新和删除操作的性能。在这些任务之前,数据库需要检查它是否违反数据完整性。这就是为什么一些架构师和DBA完全放弃外键的原因。数据仓库和分析数据库尤其如此,这些数据仓库和分析数据库不以交易方式(一次一行)处理数据,而是批量处理数据。性能是数据仓库和商业智能的一切。
  2. 旧数据和脏数据更加利于存储
    许多数据库在设计时需要存储来自旧数据库和遗留数据,这些数据可能对数据质量和完整性没有那么严格。为了能够容纳旧的脏数据,架构师可以选择(1)清理和转换遗留数据,这要耗费很大的人力成本。(2)放弃在数据库级别上强制执行参照完整性。一些打包的ERP和CRM应用程序也使用这种方法。
  3. 全表重新加载的时候会更加方便
    一些数据库,如数据仓库,分段或接口数据库,需要经常从外部重新加载数据。这会导致重新加载时数据不一致(在父表为空的情况下,子表可能已满载)。这可以通过在重新加载时禁用外键来绕过。然而,这引入了额外的逻辑和复杂性以及另一个失败点。如上所述,对性能有负面影响。通常,成本大于收益,开发人员不用担心外键。
  4. 采用更高层次的框架来解决约束问题
    一些应用程序使用编程框架,在物理数据库之上创建另一个逻辑层。开发人员不使用插入或更新语句来修改数据,而使用API或者框架在后台执行所有操作。ORM(对象关系映射)框架或Ruby on Rails框架就是这种情况。这些工具负责参照完整性,并与RDBMS一起创建更高级别的数据库引擎。这些框架可以自己创建数据库表,而不总是创建外键。使用这些工具的开发人员很少会干扰自动生成的模式,并且不需要外键。
  5. 鼓励创新,对更改开放
    这种观点认为,增加外键会降低设计者的优化欲望,因为修改过程较为麻烦,所以限制了设计人员的创新思维。
  6. 架构师或设计师的懒惰心理得到满足
    创建表的时候只要自己心里知道他们的关联关系就好了,不需要做那么多额外的设置,并且一旦需要调整设计就会十分繁琐,所以有很多设计人员就不再设置外键了。
  7. 保持模型的复杂度,维护个人地位
    每一个设计者都希望自己是不可替代的,设计出复杂的数据模型,而不设置外键约束,这样就只有自己清楚他们的关联关系,只有自己能够进一步维护,出了问题也只有自己最清楚,从而可以保持自己的竞争力。这种想法看似邪恶,但是这样做的确实大有人在。

MySQL是日常工作中使用最对的数据库之一,所以必须要要较为深入和全面的掌握,对于高阶人员还要掌握分布式事务、各种数据库锁、传播机制等

数据库表设置外键VS不设置外键,哪个更好?相关推荐

  1. 如何在sqlserver数据库表中建立复合主键

    主键是数据库表的一个重要属性,建立主键可以避免表中存在完全相同的记录,也就是说主键在一张表中的记录值是唯一的. 建立主键有两种方法:一种是在数据库提供的GUI环境中建立,另一种是通过SQL语句执行建立 ...

  2. ##MySql数据库表的操作与应用

    #新建数据库 CREATE DATABASE school; #查看数据库 SHOW DATABASES; #查看当前新建数据库 SHOW CREATE DATABASE school; #换库 US ...

  3. 美多商城之商品(商品数据库表设计)

    一.商品数据库表设计 1.1 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍      [即为商品的一个概述,一种商品的统称] SPU = Standard Pr ...

  4. java修改数据库表结构_数据库设计(一):设计传统系统表结构(Java开发)

    以下文章来源于微信公众号 程序编程之旅 ,作者陈浩翔 此处仅供本人学习记录之用,侵删 本篇为第一篇.讲解传统系统的表结构设计(Java开发). 讲讲如何避免数据库设计的一些坑,方便后期的开发与维护. ...

  5. SQL Server数据库表的基本操作(批量插入、删除、查询数据,删除表中重复数据方法)

    实验名称:数据库表的基本操作与表内数据操作 实验目的: 掌握数据库表创建方法(交互式.T-SQL法) 掌握修改数据库表结构的方法 掌握删除数据库表的方法 掌握交互式EXCEL文件录入数据至数据库表的方 ...

  6. 绝对正确!解释“超键、候选键和主键”之间的关系

    超键: 是一组单个或多个键,用于标识表中的行. 候选键: 是一组唯一标识表中元组的属性,可以理解为是一个没有重复属性的超级键,是超键的子集. 主键: 是表中的一个属性或一组属性,用于唯一标识该表中的每 ...

  7. 数据库mysql表怎么设置外键_如何设置数据库中的外键

    展开全部 创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关系图只e69da5e887aa62616964757a686964616f31333365653739有主键没有外键 ...

  8. 实际开发中,是否会在数据库表中设置外键?

    本科学习数据库的时候,书上明确的写了对于多对多关系必须要创建外键,可是最近在跟师兄做一个B/S架构的项目,发现所设计的数据库表虽然是多对多关系但并没有要求外键,查了一下之后才发现目前的大型系统中(尤其 ...

  9. mysql表定义外键语法_mysql设置外键的语法怎么写?

    2012-08-31 回答 mysql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加er图的可读性 有些人认为外键 ...

最新文章

  1. 半导体基础知识(4):无源,有源和机电组件
  2. harris角点检测_角点检测(2) - harris算子 - 理论与Python代码
  3. linux uts namespace 提供了主机名和域名的隔离 docker中被用到
  4. 家里用服务器放在哪个位置,路由器摆放在家中哪个位置好 路由器摆放位置【详解】...
  5. 每天学一点儿shell:正则表达式
  6. Linux进阶之路————CentOS网络配置
  7. Hibernate 与触发器协同工作
  8. 大学英语综合教程四 Unit 6 课文内容英译中 中英翻译
  9. 产业区块链一周动态丨数字货币发展写入十四五规划,湖南印发区块链发展规划...
  10. 2021-2027全球与中国触摸屏人机界面(HMI)市场现状及未来发展趋势
  11. 从现实到理想,你只差一个透视宝的距离
  12. DOM节点深度克隆函数cloneNode()用法实例
  13. 《魔道祖师》第三季预告片首发为汪叽庆生
  14. SpringBoot 做系统的权限管理——
  15. 华硕梅林固件成功安装astrill后,点进去一片空白
  16. linux的wc是什么命令,Linux中wc命令起什么作用呢?
  17. linux如何让两台或多台服务器时间同步
  18. Python-Pyecharts高清图片导出及在PPT中动态展示
  19. oracle 报错总结
  20. 小米5设置位置服务器,小米导航及所在地最佳GPS配置[教程]

热门文章

  1. 中心极限与大数定理律的关系_麦克斯韦速度分布律与气体分子碰壁数的推导
  2. python中的“ ... ”
  3. jmeter接口自动化,你敢想,我敢玩
  4. 论文结论写什么,如何写?
  5. 收入--支出=储蓄?
  6. 广州Java培训,疯狂Java如何?谈谈疯狂Java,谈谈李刚
  7. SDKS企业级区块链应用平台
  8. 去除标点符号乱码quot---转义字符
  9. php标题行,php 显示标题
  10. 企业软件投资:逆势穿越周期,重回黄金时代