当前位置:首页 > 数码 > 凭什么不让使用外键!-你知道吗 (为什么不让)

凭什么不让使用外键!-你知道吗 (为什么不让)

admin7个月前 (04-28)数码25

外键(ForeignKey)是用于建立表之间关系的,它定义了一个表中的一列或一组列,这些列的值必须在另一个表的主键列中存在。MySQL外键最大的作用就是有助于维护数据的一致性和完整性。

外键的问题

但是,在很多大型互联网公司中,很少用外键的,甚至阿里巴巴开发手册中明确规定了:【强制】不得使用外键与级联,一切外键概念必须在应用层解决。说明:以学生和成绩的关系为例,学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的student_id,同时触发成绩表中的student_id更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

性能问题

外键会增加数据库的维护负担,因为每次插入、更新或删除数据时,数据库都需要检查外键约束的完整性。这会导致性能开销,尤其是当数据量很大时。

在插入新的数据之前,数据库需要执行数据一致性检查以确保引用的外键值在相关表中存在。这额外的检查也会增加插入操作的执行时间。

锁竞争问题

外键还会导致锁竞争问题。当多个事务同时尝试插入或更新数据时,它们可能需要获取额外的锁以确保数据一致性。这可能会导致事务之间的锁竞争,降低并发性能。

一旦出现锁竞争,就可能带来更加严重的死锁问题。因此,在设计数据库时,需要尽量避免锁竞争。

无法适应分库分表

当数据量大到一定程度时,需要考虑对数据库进行分库分表。但在分库分表环境中,相关数据可能分布在不同的数据库中,外键通常难以跨越不同数据库来建立关系。

更重要的是,在分库分表环境中,数据的一致性更难维护。跨库事务难以实现,这会给数据管理带来很大的挑战。

结论

外键虽然可以帮助维护数据的一致性和完整性,但它也会带来一些额外的开销、锁竞争和适应性问题。在大型互联网公司中,通常会避免使用外键,而是通过应用层代码来实现数据的一致性。


凭什么不让使用外键!

外键是什么意思

外键是关系数据库中一个重要的概念,它用来指定一列或一组列与另一个表中的某个列建立关联。外键有助于维护表之间的逻辑关系和数据的完整性,确保关联表中的数据一致性。举个例子,如果一个销售记录表关联一个客户信息表,那么销售记录表中的“客户ID”列就可以作为外键,并参照客户信息表中的“ID”列,确保每个销售记录都对应正确的客户信息。

在实际数据库设计中,外键可以用来表示各种关系,例如一对一关系、一对多关系或多对多关系等。根据需要,还可以使用复合外键,即由多列(或字段)组成的外键。具体实现时,外键通常通过约束规定来维护数据的完整性,例如实体完整性、引用完整性、级联删除等规则。对于大型数据库,外键的合理使用可以减少数据冗余,提高查询效率,并有效避免数据的错误或不一致。

虽然外键在关系型数据库中具有重要作用,但它也存在一些限制和局限性。例如,外键约束可能会导致性能下降,特别是当表之间关系较为复杂,需要多次关联时。此外,在同一数据库内的不同表中使用外键会增加复杂度和维护成本。因此,可以根据具体情况合理使用外键,有时也可以使用其他方法实现关系维护和数据完整性保证。总的来说,外键是数据库设计中必不可少的工具,应当充分理解和运用。

大家设计数据库时使用外键吗

外键是否采用看业务应用场景,以及开发成本的,大致列下什么时候适合,什么时候不适合使用:1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;若是把数据一致性的控制放到事务中,也即让应用服务器承担此部分的压力,而引用服务器一般都是可以做到轻松地水平的伸缩;2.传统行业1>.软件应用的人数有限,换句话说是可控的;2>.数据库服务器的数据量也一般不会超大,且活跃数据有限;综合上述2句话描述,也即数据库服务器的性能不是问题,所以不用过多考虑性能的问题;另外,使用外键可以降低开发成本,借助数据库产品自身的触发器可以实现表与关联表之间的数据一致性和更新;最后一点,使用外键的方式,还可以做到开发人员和数据库设计人员的分工,可以为程序员承担更多的工作量;

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: 外键