目录
4.E-R图也称实体-关系图(Entity Relationship Diagram)
4.用exists替代in、用not exists替代not in
一、数据库设计
1.为什么需要数据库设计?
俗话说有好的设计,才有好的优化,数据库作为信息系统的核心,其设计自然是重中之重。
2.数据库设计的3大范式
1NF:
- 所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合、数组、记录等非原子数据项。
2NF:
- 第二范式是在第一范式基础上更进一层。
- 第二范式要确保数据库表中的每一列都和主键相关,而不能至于主键的某一部分相关(主要针对联合主键而言)。
- 也就是说在一个数据库表中,一个表只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
3NF:
- 第三范式要求每列都和主键直接相关而不是间接相关。
3.数据库设计的步骤
需求分析阶段
- 准确了解和分析用户需求(包括数据与处理)。
- 是整个设计过程的基础,是最困难、最耗时的一步。
概念结构设计阶段
- 是整个数据库设计的关键。
- 设计数据库的E-R模型图,确认需求信息的正确和完整。
逻辑设计阶段
- 将E-R图转换为逻辑模型(逻辑模型为关系模型则体现为多张表)
- 应用数据库设计的3大范式进行审核
- 设计外模式,建立视图
物理设计阶段
- 确定存取方法(例如索引的设定)
- 确定存储结构(文件存放的位置等),并编写代码实现前端应用
数据库实施阶段
- 将数据载入,并对数据库进行测试。
运行和维护阶段
- 使用和维护数据库
4.E-R图也称实体-关系图(Entity Relationship Diagram)
提供了表示实体类型、属性和关系的方法,是用来描述现实世界的概念模型。
在E-R图中有以下4个成分:
- 矩形框:表示实体,在框中记录实体名
- 菱形框:表示关系,在框中记录关系名
- 椭圆形框:表示实体或关系的属性,将属性名记入框中。对于主属性名,则在其名称下划线。
- 连线:实体与属性之间;实体与关系之间;关系与属性之间用直线连接,并在直线上标注关系的类性。(对于一对一关系,要在两个实体连线方向各写1;对于一对多关系,要在一的一方写1,多的一方写N;对于多对多关系,要在两个实体连线方向各写N,M。)
- 如下图:
5.实体之间的关系
一对一:个人信息和档案信息
- 外键添加唯一约束
- 让主键做外键
一对多:雇员和部门
- 主键作为外键,外键设置在多的一方。
多对多:学生和课程
- 创建关系表
- 关系表创建联合主键
二、数据库优化
1.select 字句中避免使用(*)
比如oracle在解析过程中,会将(*)依次转换成所有的列名,这个工作通过查询数据字典完成的,这意味着将耗费更多的时间。
2.索引失效的情况
- 索引列使用 not / != / <> / > / < / not null / null:如果某列建立索引,当进行select * from emp where deptno is not null / is null,则索引会失效。
- 索引列上不要使用函数,如下均会失效
- select col from tbl where substr(name,1,3)='abc';
- select col from tbl where name like '%abc%';
- select col from tbl where name like 'abc%';#这个索引会生效
- 索引列上不能进行计算
3.用UNION替换OR(使用于索引列)
通过情况下用UNION替换where字句中的or将会起到较好的效果,对索引列使用or将造成全表扫描。注意,这个规则只针对多个索引列有效。如果有列没有被索引,查询效率可能会因为你没有使用or而降低。
4.用exists替代in、用not exists替代not in
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行连接,在这种情况下,使用exists(或not exists)通常将提高查询的效率。
在子查询中,not in字句将执行一个内部的排序和合并,无论在哪种情况下,not in 都是最低效的(因为它对子查询中的表执行了一个全表遍历)。为了避免使用not in,我们可以把它改外连接或not exits。
高效:select * from emp where exists (select 'x' from dept where dept.deptno = emp.deptno and loc='melb');
低效:select * from emp where deptno in (select deptno from dept where loc='melb');
三、备份和还原
备份命令:mysqldump -uroot -proot dbname > d:/t.sql
还原命令:mysql -uroot -p < d:/t.sql