一、数据库的设计
1.多表之间的关系
1)一对一(了解)
如:人和身份证
分析:一个人只有一个身份证,一个身份证只能对应一个人
2)一对多(多对一)
如:部门和员工
分析:一个部门有多个员工,一个员工只能对应一个部门
3)多对多
如:学生和课程
分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择
2.实现关系
1)一对多(多对一)
如:部门和员工
实现方式:在多的一方建立外键,指向一另一方的主键。
2)多对多
如:学生和课程
实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,
这两个字段作为第三张表的外键,分别指向两张表的主键。
3)一对一(了解)
如:人和身份证
实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。
3.数据库设计的范式
1.设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求。
2.基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
2.第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关
二、事务
1.事务的基本介绍
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
操作:1.开启事务:start transaction;
2.回滚:rollback;
3.提交:commit
MySQL数据库中事务默认自动提交,事务提交的两种方式:
1.自动提交:
mysql就是自动提交的
例如:一条DML(增删改)语句会自动提交一次事务。
2.手动提交:
需要先开启事务,再提交
Oracle数据库默认是手动提交事务
3.修改事务的默认提交方式:
--查看事务的默认提交方式:
SELECT @@autocommit; -- 1 代表自动提交 0 代表手动提交
--修改默认提交方式:
SET @@autocommit = 0;
2.事务的四大特征ACID
1.原子性
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
2.一致性
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
3.隔离性
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
4.持久性
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
三、视图
1.什么是视图?
视图是基于 SQL 语句的结果集的可视化的表,即视图是一个虚拟存在的表,可以包含表的全部或者部分记录,也可以由一个表或者多个表来创建。使用视图就可以不用看到数据表中的所有数据,而是只想得到所需的数据。当我们创建一个视图的时候,实际上是在数据库里执行了SELECT语句,SELECT语句包含了字段名称、函数、运算符,来给用户显示数据。使用视图查询可以使查询数据相对安全,通过视图可以隐藏一些敏感字段和数据,从而只对用户暴露安全数据。视图查询也更简单高效,如果某个查询结果出现的非常频繁或经常拿这个查询结果来做子查询,将查询定义成视图可以使查询更加便捷。
2.视图创建及使用方法
完整创建语法: CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
1)OR REPLACE:表示替换已有视图,如果该视图不存在,则CREATE OR REPLACE VIEW与CREATE VIEW相同。
2)ALGORITHM:表示视图选择算法,默认算法是UNDEFINED(未定义的):MySQL自动选择要使用的算法 ;merge合并;temptable临时表,一般该参数不显式指定。
3)DEFINER:指出谁是视图的创建者或定义者,如果不指定该选项,则创建视图的用户就是定义者。
4)SQL SECURITY:SQL安全性,默认为DEFINER。
5)select_statement:表示select语句,可以从基表或其他视图中进行选择。
6)WITH CHECK OPTION:表示视图在更新时保证约束,默认是CASCADED。
1.一般用法:
CREATE VIEW 视图名 AS SELECT 查询语句;
2.修改视图
ALTER VIEW 视图名 AS SELECT 查询语句;
3.删除视图
DROP VIEW 视图名;
3.注意事项
要通过视图更新基本表数据,必须保证视图是可更新视图,即可以在INSET、UPDATE或DELETE等语句当中使用它们。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。一般情况下不建议对视图做DML操作
如果视图包含下述结构中的任何一种,那么它就是不可更新的:
LIMIT关键字;
聚合函数;
DISTINCT关键字;
GROUP BY子句;
ORDER BY子句;
HAVING子句;
UNION运算符;
位于选择列表中的子查询;
FROM子句中包含多个表;
SELECT语句中引用了不可更新视图;
WHERE子句中的子查询,引用FROM子句中的表;
3.为什么使用视图
简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。比如说我们经常用到几个表的关联结果,那么我们就可以使用视图来处理,或者说第三方程序需要调用我们的业务库,可以按需创建视图给第三方程序查询