关于数据库的外键

一般情况下,去掉外键的原因都是想要提高性能,但是在哪里提高性能呢?如果说每一次操作外键都会帮我们检查约束,那么

我们自己维护数据完整性的话不是也要么?

1、当批量插入的时候,每一次数据库都会去检测外键的约束,而我们代码可能只需要检测一次。

试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!

2、 当系统庞大的时候,如果让代码来维护外键,软件方面的效率,可以通过加几台服务器来处理,使得效率提高,而数据库如果只有1份的话,那么数据库承受的压力必然很大。


=========================================================================

下面的内容是转自:http://apps.hi.baidu.com/share/detail/15593176


对于主/外键/索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式?


大家共同观点:

主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作,

矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。


正方观点:

1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。

eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢? 

2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。

3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。


反方观点:

1,可以用触发器或应用程序保证数据的完整性

2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题

3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert,   update,   delete   数据的时候更快)

eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!  


结论:

1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。

2,用外键要适当,不能过分追求

3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。





 

<think> 首先,用户指令是基于之前的系统级指令,我必须遵守所有规则: - 行内数学表达式用$...$,如$x^2$。 - 独立公式用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾自然地添加引用标识,如[^1]。 用户的问题是关于数据库的详细介绍。我需要参考提供的引用: - 引用[1]:定义了,指向另一张表格以确保数据完整性。 - 引用[2]:不建议使用的原因,包括分布式系统中的复杂性。 - 引用[3]:约束的优点,如数据完整性、一致性。 - 引用[4]:详细解释,包括添加和删除的SQL语法。 - 引用[5]:创建表时定义的SQL语法。 我的回答需要结构清晰,帮助用户逐步解决问题。回答应该包括: 1. 的定义和作用。 2. 的优点。 3. 的缺点或为什么不建议使用。 4. 如何创建和使用(包括SQL示例)。 5. 自然地添加引用标识到相关内容。 最后,生成相关问题。问题应该基于主题,有助于深入学习。 结构化回答: - 引言:简要介绍。 - 定义和作用:详细解释是什么、为什么使用。 - 优点:基于引用[3]。 - 缺点:基于引用[2]。 - 创建和使用:SQL示例基于引用[4]和[5]。 - 总结:平衡观点。 - 相关问题:生成3-5个相关问题。 添加引用: - 当提到定义时,添加[^1]。 - 当提到不建议使用时,添加[^2]。 - 当提到优点时,添加[^3]。 - 当提到SQL语法时,添加[^4]或[^5]。 使用中文回答。 生成相关问题: 1. 数据库的最佳实践是什么? 2. 如何优化约束在分布式系统中的性能? 3. 约束和应用程序级约束有什么区别? 4. 在关系型数据库中的作用有哪些实际应用? 确保回答真实可靠,基于提供的引用。 </think> ### 数据库的详细介绍 下面我将基于您提供的参考资料,逐步介绍数据库的定义、作用、优缺点、使用方法以及相关场景。是关系型数据库中的核心概念,用于维护表之间的关联关系和确保数据完整性。 #### 1. **定义与基本概念** (Foreign Key)是一个指向另一个表(称为主表)的字段或字段组,其值与主表中的某个字段(通常为主)的值必须匹配。这种机制强制保证了数据的一致性:例如,在学生表和教师表中,学生表的 `teacher_id` 字段可以作为,指向教师表的 `id` 字段(主),确保每个学生都引用一个有效的教师记录[^1]。约束定义了这种关系,例如在删除或更新主表记录时,数据库会自动处理相关子表记录(如级联删除)[^4]。 #### 2. **的作用与优点** 主要用于实现数据完整性和一致性约束: - **数据完整性**:确保子表(如学生表)中的值在主表(如教师表)中存在,防止出现孤立或无效记录[^1]。 - **一致性维护**:通过级联操作(如 `ON DELETE CASCADE`),当主表记录被删除时,关联的子表记录自动更新或删除,减少数据冗余[^3]。 - **自动化关系管理**:数据库管理系统自动处理插入、更新和检查,降低了开发人员手动维护关系的负担[^3]。 这些优点在事务型系统中尤为重要,例如在电子商务订单系统中,确保订单项引用有效产品ID,避免了数据错误[^1][^3]。 #### 3. **的缺点与为什么不建议使用** 尽管有诸多优点,在某些场景下不建议使用: - **分布式系统中性能问题**:在分布式数据库(如分片或节点部署)中,跨节点的检查和维护可能引发高延迟和复杂性。例如,主表和子表存储在不同服务器时,约束可能导致频繁的跨节点查询,显著增加成本和延迟[^2]。 - **灵活性限制**:约束使数据操作(如批量删除)变慢,并可能影响迁移或伸缩性。在高并发系统中,级联操作可能产生锁竞争,降低性能[^2]。 - **实现复杂性**:在非关系型数据库或微服务架构中,约束难以适用,开发者通常改用应用程序级约束(如代码逻辑)来替代[^2]。 #### 4. **如何使用** 的创建和管理通过SQL语句实现。以下是常见操作示例: - **创建表时定义**:使用 `CREATE TABLE` 语句添加约束。 ```sql CREATE TABLE teacher ( id INT PRIMARY KEY, name VARCHAR(50) ) ENGINE=INNODB; CREATE TABLE student ( id INT PRIMARY KEY, teacher_id INT, constraint fk_teacher FOREIGN KEY (teacher_id) REFERENCES teacher(id) ON DELETE CASCADE ) ENGINE=INNODB; ``` 这里,`student` 表是子表,`teacher` 表是主表,`ON DELETE CASCADE` 表示删除教师记录时自动删除关联学生记录[^5][^4]。 - **添加到现有表**:使用 `ALTER TABLE` 语句。 ```sql ALTER TABLE student ADD CONSTRAINT fk_teacher FOREIGN KEY (teacher_id) REFERENCES teacher(id) ON DELETE CASCADE; ``` 这个语法允许动态添加约束,确保数据关联[^4]。 - **删除**:使用 `ALTER TABLE` 移除约束。 ```sql ALTER TABLE student DROP CONSTRAINT fk_teacher; ``` 这在需要优化系统或迁移数据时非常有用[^4]。 #### 5. **总结** 是关系型数据库的关约束机制,能有效提升数据可靠性和一致性,但需权衡性能和分布式环境下的适用性。在集中式系统中(如传统数据库),是首选;而在大规模分布式场景(如云数据库),开发者倾向于避免使用,转而依靠业务逻辑层[^1][^2]。实际应用中,建议根据系统规模和需求选择方案,例如在MySQL或PostgreSQL中测试性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值