课堂课题:
什么是外键,用处是什么,为什么不建议使用外键做关联?
关联任务:
任务五
直播时间:
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)结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
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