数据库设计的范式以及事务

数据库设计的范式

数据库设计的范式有好几种,主要有第一范式(1NF),第二范式(2NF)、第三范式(3NF)、以及第四范式等。
而在本文中我主要是介绍前三种范式,即第一范式、第二范式、第三范式。

首先来看三种范式的定义:
第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。
第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF。

当然,看这种定义,对有些人来说,肯定是比较难以理解的。所以,我总结一下主要的内容:
第一范式就是表中每一列都是具有原子性的,也就是说不可以继续分割。如一下情况,就是反例。学院信息这一列是可以再分的。
第一范式
第二范式说的清楚点就是在1NF基础上消除非主属性对主码的部分函数依赖。即消除下面这种情况。如根据学号(sid)就可以确定学生姓名。
在这里插入图片描述
(这里就要说到三种依赖关系了,这三种依赖关系在我说了第三范式之后讲。)

第三范式就是说在2NF的基础上,任何非主属性不依赖于其他非主属性。解决传递依赖问题。即如下这种问题:根据学生学号(sid)确定宿舍id(rid),根据宿舍id确定住宿费用。
在这里插入图片描述

函数依赖:A–>B 如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A。
函数依赖关系有三种:
1.完全函数依赖:(A–>B) 如果通过A属性组的值,可以确定唯一B属性的值,则称B依赖于A属性组中的所有属性值。
2.部分函数依赖: (A–>B) 如果通过A属性组中的一个值值,可以确定唯一B属性的值,则称B依赖于A属性组中的部分属性值。
3.传递函数依赖:(A–>B B–>C) 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性的值可以确定唯一C属性的值,则称C传递函数依赖于A。

事务

1.基本介绍:如果一个包含多个步骤的操作被事务管理,则要不成功,要么回滚。
2.操作

  1. 开启事务(start transaction)
  2. 回滚 (rollback)
  3. 提交 (commit)

3.事务的隔离级别

  1. 原子性:事务是不可分割的最小单位,要么成功,要么失败。
  2. 持久性:当事务提交或者回滚后,数据库会持久化保存数据
  3. 隔离性:多个事务之间,相互独立
  4. 一致性:事务操作前后数据总量不变

4.事务的隔离级别(了解)
概念:多个事务之间,相互隔离,相互独立,但是如果多个事务操作同一批数据,则可能会引发一些问题,设置不同的隔离级别可以解决不同问题。
首先说可能存在的问题:

  • 脏读:一个事务读取到另一个事务没有提交的数据
  • 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样
  • 幻读:一个事务操作数据表中所有记录,另外一个事务添加了一条数据,则第一个事务查询不到自己的修改。

隔离级别:

  1. read uncommited(读未提交)
    * 产生问题:脏读、不可重复读、幻读
  2. read commit
    * 产生问题:不可重复读、幻读
  3. 可重复读
    * 产生问题:幻读
  4. Serializable(串行化)
    * 可以解决所有问题

但是需要注意的是,隔离级别从1到4的安全性越来越高,但是效率也越来越低。

最后再说八个操作:
1.查询事务的默认提交方式:

select @@antocommit;    -- 1代表自动提交   0代表手动提交

2.修改默认提交方式:

set @@antocommit = 0;  -- mysql数据库默认为自动提交。

3.查询隔离界别

select @@tx_isolaction;

4.设置隔离级别

set global transaction isolation level 级别字符串;

5.数据库的备份

mysqldump -u用户名 -p密码 数据库名称 > 保存的路径;

6.数据库的还原

1.登录数据库
2.创建数据库
3.使用数据库(use db1;)
4.执行文件  (source 文件路径;)

7.修改数据库字符集

alter database 数据库名称 charactar set 字符集名称;

8.删除数据库(慎用)

drop database;

如果有问题,欢迎指正! 谢谢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章