数据库:设计、优化和备份

目录

一、数据库设计

1.为什么需要数据库设计?

2.数据库设计的3大范式

3.数据库设计的步骤

4.E-R图也称实体-关系图(Entity Relationship Diagram)

5.实体之间的关系

二、数据库优化

1.select 字句中避免使用(*)

2.索引失效的情况

3.用UNION替换OR(使用于索引列)

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。)
  • 如下图:

数据库:设计、优化和备份_第1张图片

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

你可能感兴趣的:(Java,EE,数据库)