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

课堂课题:

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

关联任务:

任务五

直播时间:

2019-04-23 15:30: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-童志荣


Mybatis有哪些常用标签?怎么使用标签来完成动态查询?



大家好,我是IT修真院西安分院第6期的学员蔡凯,一枚正直纯洁善良的Java程序员,今天给大家分享一下,修真院官网Java任务一,深度思考中的知识点——什么是外键,用处是什么,为什么不建议使用外键做关联?



(1)背景介绍:

什么是外键?

如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

        



(2)知识剖析:

外键的用处是什么?

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

        

如果不使用外键,表2的学号字段插了一个值(比如20140999999),但是这个值在表1中并没有,这个时

候,数据库允许插入,并不会对插入的数据做关系检查。然而在设置外键的情况下,你插入表2学号字段的值必须要求在表1的学号字段能找到。 同时,如果你要删除表1的某个学号字段,必须保证表2中没有引用该字段值的列,否则就没法删除。这就是所谓的保持数据的一致性和完整性。

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

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



性能问题:

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

扩展性问题:

这里主要是分为两点:

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

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


技术问题:

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

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


并发问题:

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


(3)编码实战

mysql设置外键

alter table locstock add foreign key locstock_ibfk2(stockid) references product(stockid)

locstock 为表名, locstock_ibfk2 为外键名 第一个括号里填写外键列名, product为表名,第二个括号里是写外键关联的列名

        



(4)常见问题:

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))

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


Q2:索引和外键什么关系? 

A2:外键是用来关联两个表的,索引是用来加速表查询的。

 

Q3:sql内链接外连接与表的主键,外键有什么关系?只有这两张表存在关系才可以使用内链接和外连接么?要求该表的外键是另一张表的主键?

A3:没有任何关系,不需要先建立关系,一样可以连接操作,内连接和外连接(对左连接、右连接、全连接的统称)只是对于关系中失配的数据的处理不同。



(5)参考文献:

https://ask.csdn.net/questions/241400

https://ask.csdn.net/questions/189370

https://ask.csdn.net/questions/364669

 https://blog.csdn.net/u012045045/article/details/86525444








(6)更多讨论:


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))

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


Q2:索引和外键什么关系? 

A2:外键是用来关联两个表的,索引是用来加速表查询的。

 

Q3:sql内链接外连接与表的主键,外键有什么关系?只有这两张表存在关系才可以使用内链接和外连接么?要求该表的外键是另一张表的主键?

A3:没有任何关系,不需要先建立关系,一样可以连接操作,内连接和外连接(对左连接、右连接、全连接的统称)只是对于关系中失配的数据的处理不同。




(7)结束语:



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


技能树.IT修真院“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。


这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~


我的邀请码:35138865,或者你可以直接点击此链接:http://www.jnshu.com/login/1/35138865


评论

请您登录 后进行评论