为什么不建议用外键?

在 MySQL 中,有些开发人员建议避免使用外键(Foreign Keys),主要原因如下:

  1. 性能问题

    • 外键约束在插入、更新和删除操作时,会导致额外的检查和锁定,从而影响性能。尤其是在大批量数据操作时,这种开销可能会非常显著。
    • 外键约束可能导致复杂的锁定行为,从而降低并发性能。
  2. 灵活性

    • 使用外键会限制数据库结构的灵活性。例如,在分区或分表操作时,外键可能会成为一种约束,限制数据库设计的变化。
    • 当需要进行数据迁移、拆分数据库或进行水平扩展(sharding)时,外键约束会增加复杂性。
  3. 维护复杂性

    • 外键约束可能导致删除或更新操作变得复杂。例如,删除一个表中的记录可能会因为外键约束导致多个表中的数据也需要被删除。
    • 数据库设计的维护和升级会变得更加复杂,需要确保所有外键约束的一致性和正确性。
  4. 一致性保障

    • 有些开发人员更倾向于通过应用层代码来保证数据一致性,而不是依赖数据库层的外键约束。他们认为这样可以更灵活地处理各种业务逻辑和错误情况。
  5. 数据库支持

    • 虽然 InnoDB 存储引擎支持外键,但 MyISAM 等其他存储引擎不支持外键。如果系统中使用了多种存储引擎,外键的使用会受到限制。

替代方案

尽管外键有以上这些缺点,但它们仍然在保证数据一致性和完整性方面有其独特的价值。如果决定不使用外键,可以考虑以下替代方案来确保数据一致性:

  1. 应用层控制

    • 在应用层通过代码逻辑来确保数据一致性。例如,在插入或更新操作时,先检查关联数据是否存在,确保数据关系的正确性。
  2. 触发器(Triggers)

    • 使用数据库触发器来代替外键约束,手动管理数据关系。触发器可以在插入、更新或删除操作时执行自定义逻辑,以维护数据一致性。
  3. 批量校验

    • 定期运行批量校验脚本,检查和修复数据库中的不一致性数据。
  4. 事务控制

    • 使用事务来确保多个相关操作的原子性。确保在事务中执行的所有操作要么全部成功,要么全部失败,从而保持数据一致性。

结论

是否使用外键需要根据具体项目的需求和约束来决定。对于一些复杂的业务场景或大规模的系统设计,可能需要权衡外键带来的数据一致性保证与性能、灵活性之间的关系。在设计数据库架构时,需要根据具体情况做出最佳决策。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/862460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue项目生产环境的打包优化

Vue项目生产环境的打包优化 前言 在这篇文章我们讨论Vue项目生产环境的打包优化,并按步骤展示实际优化过程中的修改和前后对比。 背景 刚开始的打包体积为48.71M 优化 步骤一:删除viser-vue viser-vue底层依赖antv/g2等库一并被删除,…

【selenium 】操作元素

操作元素 元素操作鼠标操作键盘操作 元素操作 元素操作示例清空输入框clear()deiver.find_element_by_id(“username”).clear()输入文字send_keys()deiver.find_element_by_id(“username”).send_keys(‘zs’)元素点击 click()deiver.find_element_by_id(“login”).click()…

【高级篇】MySQL性能监控与故障排查:洞悉与优化(十六)

引言 在深入探讨了InnoDB引擎的内部机制后,我们转向了MySQL性能监控与故障排查的实践领域。这一章节将指导你如何运用一系列强大的监控工具和日志分析技巧,识别并解决数据库中的性能瓶颈和常见故障,为即将到来的MySQL与云环境的融合打下坚实基础。 一. 常用监控工具:透视…

720漫游快速入门

720云全景漫游制作工具自2014年8月上线后,为数十万创作者提供全景图片&全景视频&高清矩阵上传、编辑、分享一站式软件服务,获得众多创作者的青睐与认可,同时也承载了创作者越来越多的期望,为了给大家提供更灵活多样的功能…

【Linux】动/静态库的创建和使用

目录 一、动/静态库的概念回顾: 二、动态库与静态库的区别: 三、静态库的创建与使用: 1、Linux静态库命名规则: 2、静态库的创建和使用: 四、动态库的创建与使用: 1、Linux动态库命名规则&#xff1…

如何根据经纬度查询所在城市

参考文献: https://www.jianshu.com/p/893d359dea0f

【python】pop()函数

python pop() ,如何在Python的列表或数组中移除元素 使用 pop() 从列表中删除元素 pop() 语法概述 pop() 方法的语法如下: list_name.pop(index)list_name:列表变量名;内置的 pop() 方法仅需要一个可选参数;可选参…

Windows若要成为最受欢迎的操作系统,则需要解决5个问题

序言 Windows正变得与我在过去几十年中第一次喜欢和使用的操作系统大不相同,但尽管我觉得它偏离了崇高的道路,如果我可以成为CEO一天,那么我会改变以下五件事,让世界上最受欢迎的操作系统重回正轨。 非必要更新的永久延期 多年来…

地平线x3pi板子烧录linux

可以遵循以下链接下载烧录系统与linux镜像,并在新的sd卡里烧录Linux镜像系统并启动。​​​​​​地平线RDK套件 | RDK X3用户手册 注意烧录的镜像需要destop版本。 Index of /downloads/os_images/2.1.0/release/

CSS3 框大小

CSS3 框大小 在CSS3中,框大小(Box Sizing)是一个重要的概念,它决定了如何计算一个元素的总宽度和高度。本文将详细介绍CSS3中的框大小属性,包括其基本用法、浏览器支持情况以及在实际开发中的应用示例。 基本概念 在…

【无人机三维路径规划】基于鱼鹰算法OOA实现复杂城市地形下无人机避障三维航迹规划附Matlab代码

% 初始化遗传算法参数 population_size 50; % 种群大小 max_generations 100; % 最大迭代次数 mutation_rate 0.1; % 突变率 % 定义目标函数(适应度函数) fitness_function (x) calculate_fitness(x); % 定义路径规划问题的约束函数 constraint_fu…

SQL面试题练习 —— 微信运动步数在好友中的排名

目录 1 题目2 建表语句3 题解 题目来源:腾讯。 1 题目 有两个表,朋友关系表user_friend,用户步数表user_steps。朋友关系表包含两个字段,用户id,用户好友的id;用户步数表包含两个字段,用户id&am…

鸿蒙HarmonyOS自定义组件开发和使用

自定义组件的介绍 在开发和使用自定义组件直接,我们需要了解什么是自定义组件? 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常…

【Mysql】多表查询、隐式内链接、显式内连接、左外连接、右外连接

多表查询 什么是多表查询 •DQL: 查询多张表,获取到需要的数据 •比如 我们要查询家电分类下 都有哪些商品,那么我们就需要查询分类与商品这两张表 数据准备 创建db3_2 数据库 -- 创建 db3_2 数据库,指定编码 CREATE DATABASE db3_2 CHARACTER SET utf8;创建分类表与商品表 …

美力AI如何改变美妆行业游戏规则

人工智能 (AI) 正在席卷全球,彻底改变我们所知的行业。美容和时尚行业是深受人工智能技术影响的行业之一。人工智能(包括生成式人工智能)是美容和时尚行业激发信心和产品发现的强大工具,品牌可以利用这项技术为客户激发灵感。 凭…

坑——python的redis库的decode_responses设置

python的redis库查询返回的值默认是返回字节串,可以在redis.Redis()方法中通过设置decode_responses参数,让返回值直接是字符串; 查询返回字节串是因为Redis()方法中decode_responses默认值是False: 设置decode_responses为True就…

【从零开始实现联邦学习】

1. 环境配置如下 python3.7pip install torchpip install torchvision 2. 代码如下 原书的代码存在一点bug,现已被作者修复 Client端代码如下 import torch.utils.dataclass Client(object):def __init__(self,conf,model,train_dataset,id1):self.conf conf …

为什么不再推荐使用 VRTK 4?

引言 VRTK (Virtual Reality Toolkit) 发布于2016年,初期受到了广大开发者的欢迎并被广泛采用。但是随着 VR 开发生态的发展,这款工具逐渐失去了最初的光芒。本文试图通过几个维度的分析,解释为什么目前不推荐使用 VRTK 进行开发的理由&…

Eigen中关于四元数的常用操作

四元数(Quaternion)是一种数学工具,广泛用于计算机图形学、机器人学和物理模拟中,特别适合处理三维旋转。Eigen库是一个高性能的C数学库,提供了丰富的线性代数功能,其中就包括对四元数的支持。 1. 为什么选…

mklink

文章目录 mklink概述笔记备注END mklink 概述 看一个开源工程中,有一个.bat脚本,用来建立符号链接。 用的是mklink, 试试,比快捷方式好用。 笔记 测试环境 win10x64-22H2 准备测试用的文件 D:\my_tmp\dir1\readme.txt mklink的命令行帮助…