IT修真院·小课堂丨互联网职业小课堂在线学习平台

课堂课题:

什么是外键,用处是什么,为什么不建议使用外键做关联?

关联任务:

任务五

直播时间:

2019-06-26 15:00:00


课堂内容:

视频链接:

PPT链接:

提交按钮:

小课堂内容格式


标题:

【修真院xx(职业)小课堂】课题名称

开场语:

大家好,我是IT修真院XX分院第X期的学员XX,一枚正直纯洁善良的XX程序员,今天给大家分享一下,修真院官网XX(职业)任务X,深度思考中的知识点——XXX

(1)背景介绍:

背景介绍的时候,尽可能的要宽广,讲清楚来龙去脉,讲清楚为什么会需要这个技术。

(2)知识剖析:

讲知识点的时候,尽可能的成体系,学会成体系的去给别人介绍知识。现在很多做的都是零散的,没有分类。

(3)常见问题:

最少列出1个常见问题。

(4)解决方案:

写清楚常见问题的解决方案。

(5)编码实战:

尽可能的去寻找在真实项目中在用的。如果你能找到某个网站在用你说的知识点,这是最好的。学以致用,否则当成练习题就没有意义了。多准备一些demo,讲解过程中将知识点和demo结合,便于大家理解所讲解的知识点。

(6)拓展思考:

知识点之外的拓展思考,由分享人进行讲解,这些东西就是所谓的深度,也是一个人技术水准高低比较的表现。

(7)参考文献:

引入参加文献的时候,在引用的句子后面加上序号【1】。参考文献中列出详细来源。不要去抄别人的东西,这是一个基本的态度。

(8)更多讨论:

Q1:提问人:问题?
A1:回答人(可以是分享人,也可以是其他学员):回答
Q2:提问人:问题?
A2:回答人(可以是分享人,也可以是其他学员):回答
Q3:提问人:问题?
A3:回答人(可以是分享人,也可以是其他学员):回答

(9)鸣谢:

感谢XX、XX师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

什么是外键,用处是什么,为什么不建议使用外键做关联?     中品

辅导师兄 [真传弟子]JAVA-孙壮壮


标题:

【修真院java(职业)小课堂】什么是外键,用处是什么,为什么不建议使用外键做关联?

开场语:

大家好,我是IT修真院上海分院第十四期的学员孔晓平,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java(职业)任务五,深度思考中的知识点——什么是外键,用处是什么,为什么不建议使用外键做关联?

(1)背景介绍:

什么是外键?

简单的讲,就是两个表,一个主表,一个从表,主表的主键,放到从表的表格内,然后这个从表和主表就通过外键关联了,这个从表的这个一列和主键有关系的数据,就是从表的外键。

(2)知识剖析:

外键的作用:

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。

阻止执行:

1、从表插入新行,其外键值不是主表的主键值便阻止插入;

2、从表修改外键值,新值不是主表的主键值便阻止修改;

3、主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);

4、主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。

级联执行:

1、主表删除行,连带从表的相关行一起删除;

2、主表修改主键值,连带从表相关行的外键值一起修改。两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。

 

首先我们明确一点,外键约束是一种约束,这个约束的存在,会保证表间数据的关系“始终完整”。因此,外键约束的存在,并非全然没有优点。

比如使用外键,可以

•   保证数据的完整性和一致性

•   级联操作方便

•   将数据完整性判断托付给了数据库完成,减少了程序的代码量

然而,鱼和熊掌不可兼得。外键是能够保证数据的完整性,但是会给系统带来很多缺陷。正是因为这些缺陷,才导致我们不推荐使用外键,具体如下

性能问题

假设一张表名为user_tb。那么这张表里有两个外键字段,指向两张表。那么,每次往user_tb表里插入数据,就必须往两个外键对应的表里查询是否有对应数据。如果交由程序控制,这种查询过程就可以控制在我们手里,可以省略一些不必要的查询过程。但是如果由数据库控制,则是必须要去这两张表里判断。

并发问题

在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。若是在高并发大流量事务场景,使用外键更容易造成死锁。

扩展性问题

这里主要是分为两点

•   做平台迁移方便,比如你从Mysql迁移到Oracle,像触发器、外键这种东西,都可以利用框架本身的特性来实现,而不用依赖于数据库本身的特性,做迁移更加方便。

•   分库分表方便,在水平拆分和分库的情况下,外键是无法生效的。将数据间关系的维护,放入应用程序中,为将来的分库分表省去很多的麻烦。

技术问题

使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,那么这就对DBA的要求就更高了。很多中小型公司由于资金问题,并没有聘用专业的DBA,因此他们会选择不用外键,降低数据库的消耗。

相反的,如果该约束逻辑在应用程序中,发现应用服务器性能不够,可以加机器,做水平扩展。如果是在数据库服务器上,数据库服务器会成为性能瓶颈,做水平扩展比较困难。

(3)常见问题:

Q1:Mysql中设置表的外键的时候报错

报错:Cannot add or update a child row: a foreign key constraint fails (emp.#sql-1ad8_1, CONSTRAINT id_fk FOREIGN KEY (deptno) REFERENCES dept (deptno))

(4)解决方案:

A1:外键约束,外键必须是另一表中的主键

(5)编码实战:

mysql设置外键:
alter table locstock add foreign key locstock_ibfk2(stockid) references product(stockid)locstock 为表名, locstock_ibfk2 为外键名 第一个括号里填写外键列名, product为表名,第二个括号里是写外键关联的列名


(6)拓展思考:

mysql是关系型数据库,是不是非关系型数据库不存在外键这样的东西。

(7)参考文献:

https://www.cnblogs.com/rjzheng/p/9907304.html
https://www.cnblogs.com/mcad/archive/2014/12/28/4190288.html
百度百科


(8)更多讨论:

Q1:提问人:Mysql中设置表的外键的时候报错?

A1:回答人:外键约束,外键必须是另一表中的主键

Q2:提问人:想在只是不做数据库的外键,但是表字段还是这么设计,只是过是在程序里进行关联?

A2:回答人:是的,主要在程序中进行逻辑关系的设计判断。

Q3:提问人:外键约束是否只在mysql存在
A3:回答人(可以是分享人,也可以是其他学员):是的,关系型数据库通过外键关联来建立表与表之间的关系,非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定

(9)鸣谢:

感谢蔡凯师兄,此教程是在他之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~


评论

[上海|结业弟子]JAVA-徐元祥 发表于 2019-06-27 23:50:35 #1

关于外键使用的理解还是不错的。

回复

请您登录 后进行评论