Skip to content

Commit

Permalink
Merge pull request wolverinn#18 from CharlesZKQ/patch-1
Browse files Browse the repository at this point in the history
Update Database.md
  • Loading branch information
wolverinn committed May 27, 2020
2 parents 8d65bc6 + 0da2447 commit 11456a5
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions Database.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,13 @@
- 先读取想要更新的字段或者所有字段,更新的时候比较一下,只有字段没有变化才进行更新

### 常见的封锁类型?

意向锁是 InnoDB 自动加的, 不需用户干预。
对于 UPDATE、 DELETE 和 INSERT 语句, InnoDB
会自动给涉及数据集加排他锁(X);
对于普通 SELECT 语句,InnoDB 不会加任何锁;
事务可以通过以下语句显式给记录集加共享锁或排他锁:
共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。 其他 session 仍然可以查询记录,并也可以对该记录加 share mode 的共享锁。但是如果当前事务需要对该记录进行更新操作,则很有可能造成死锁。
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。其他 session 可以查询该记录,但是不能对该记录加共享锁或排他锁,而是等待获得锁
- **排它锁**(Exclusive Lock)/ X锁:事务对数据加上X锁时,只允许此事务读取和修改此数据,并且其它事务不能对该数据加任何锁;
- **共享锁**(Shared Lock)/ S锁:加了S锁后,该事务只能对数据进行读取而不能修改,并且其它事务只能加S锁,不能加X锁
- **意向锁**(Intention Locks):
Expand Down Expand Up @@ -140,10 +146,11 @@ delete;
- B完全依赖于A,就是说A中的所有属性唯一决定B,属性少了就不能唯一决定,属性多了则有冗余(叫依赖不叫完全依赖)。举例:(学号,课程名)这个主属性集可以唯一决定成绩,但是对于学生姓名这个属性,(学号,课程名)这个属性集就是冗余的,所以学生姓名不完全依赖于(学号,课程名)这一属性集;
- 主属性集/候选码集:某一组属性能够唯一确定其它的属性(主键就是从候选键集中选的一个键),而其子集不能,这样的属性组中的属性就是主属性;不在候选码集中的属性成为非主属性;
- 可以通过分解来满足 2NF:将(学号,课程名,成绩)做成一张表;(学号,学生姓名)做成另一张表,避免大量的数据冗余;
满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;
- **第三范式** 3NF:在 2NF 的基础上,非主属性**不传递依赖**于主属性
- 传递依赖:如果C依赖于B,B依赖于A,那么C传递依赖于A;
- 3NF在2NF的基础上,消除了非主属性之间的依赖;比如一个表中,主属性有(学号),非主属性有(姓名,院系,院长名),可以看到院长名这个非主属性依赖于院系,传递依赖于学号。消除的办法是分解。

必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键);
<details>
<summary>不符合范式会出现哪些异常?</summary>

Expand Down Expand Up @@ -199,7 +206,7 @@ delete;
</details>

### 什么是视图?什么是游标?
- 视图:从数据库的基本表中通过查询选取出来的数据组成的**虚拟表**(数据库中存放视图的定义)。可以对其进行增/删/改/查等操作。特别地,对视图的修改不影响基本表。好处:
- 视图:从数据库的基本表中通过查询选取出来的数据组成的**虚拟表**(数据库中存放视图的定义)。可以对其进行增/删/改/查等操作。视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);可以跟基本表一样,进行增删改查操作(ps:增删改操作有条件限制);如连表查询产生的视图无法进行,对视图的增删改会影响原表的数据。好处:
- 通过只给用户访问视图的权限,保证数据的**安全性**
- **简化**复杂的SQL操作,隐藏数据的复杂性(比如复杂的连接);
- 游标(Cursor):用于定位在查询返回的**结果集的特定行**,以对特定行进行操作。使用游标可以方便地对结果集进行移动遍历,根据需要滚动或对浏览/修改任意行中的数据。主要用于交互式应用。
Expand Down

0 comments on commit 11456a5

Please sign in to comment.