数据库复习整理

绪论

重点问题

数据和信息的联系与区别

数据是用以表示信息的符号或载体,信息是经过加工之后并对客观世界和生产活动产生影响的数据,是数据的内涵,是对数据语义的解释

数据是现象,而信息更反映实质

数据库概念中的“有组织”指的是什么?

有组织(有结构):为了高效地存取数据库中的数据,在存放数据的时候,必须按照某种方式,把数据组织起来

DBMS和DBS有什么区别?

DBMS是数据库管理软件,DBS是整个数据库系统,其中包括了硬件、软件和人员,也包括了DBMS

为什么要建立数据模型,数据模型有什么作用?

计算机不可能直接处理现实世界中的具体事物,所以人们必须事先把具体事物转换成计算机能够处理的数据,在数据库中用数据模型这个工具来抽象、表示和处理现实世界中的数据和信息

作用:对现实世界数据特征的抽象,使计算机能够处理

数据模型分为哪几种?分别有什么作用?

数据模型分为:概念模型,逻辑模型和物理模型

概念模型:对现实事物高度抽象,比如把水杯抽象成圆柱,

逻辑模型:数据模型信息化以后的表达形式,从软件管理角度组织数据

物理模型:是从数据存储角度组织数据,数据库咋存的,存什么里面

你如何理解数据库系统阶段“数据结构化”和“数据独立性高”的特点?

数据结构化:不光数据内部有结构,数据与数据之间也是有结构的,整体有结构

数据独立性高:数据与使用数据的应用程序之间有一定的独立性,当数据的结构发生改变,应用程序不必修改依然可以访问数据

说说你对概念模型的理解

对现实事物的高度抽象,高于客观事实,只是概念性的抽象,把水杯抽象成圆柱

逻辑模型的三要素是什么?

数据结构、数据操作和数据的完整性约束条件

关系模型有哪些优点?

建立在严格的数学概念的基础上:集合代数

关系模型的概念单一:关系

关系模型的存取路径对用户隐藏:更好的安全保密性

如何理解数据库系统中的“型”和“值”?模式和模式的实例分别指什么?

型(Type):对某一类数据的结构和属性的说明(表的定义)

值(Value):是型的一个具体赋值(表项)

模式:型的描述

模式的实例:模式的一个具体值

什么是数据库的独立性?独立性分为哪两种,分别如何保证?

数据与使用数据的应用程序之间有一定的独立性,当数据的结构发生改变,应用程序不必修改依然可以访问数据

独立性分为逻辑独立性和物理独立性

外模式/模式映像保证了数据的逻辑独立性

模式/内模式映像保证了数据的物理独立性

数据库系统概述

数据库四个基本概念

四个基本概念:信息和数据(D)、数据库(DB)、数据库管理系统(DBMS)、数据库系统(DBS)

信息和数据(D)

信息是经过加工的数据,或者说,信息是数据处理的结果

信息(Information):是数据经过加工处理后得到的另一种形式的数据,具有客观真实性、传递性、时效性和有用性

数据(Data):描述事物的符号记录称为数据,描述事物的符号可以是数字,也可以是文字、图形、图像、音频、视频等,数据有多种表现形式,他们都可以经过数字化后存入计算机


信息和数据区别与联系:

数据是用以表示信息的符号或载体

信息是经过加工之后并对客观世界和生产活动产生影响的数据,是数据的内涵,是对数据语义的解释

数据是现象,而信息更反映实质


对数据进一步解释:

不能把数据简单地与数字等同起来

数据的解释是指对数据含义的说明,数据的含义称为数据的语义,数据和数据的解释是不可分的

数据在计算机中用二进制串表示

数据库(DB)

数据库(DataBase,DB):长期储存在计算机内、有组织的、可共享的大量的数据集合

有组织(有结构):为了高效地存取数据库中的数据,在存放数据的时候,必须按照某种方式,把数据组织起来

常用的组织数据方式:层次模型、网状模型、关系模型

数据库管理系统(DBMS)

数据库管理系统(DataBase Management System,DBMS):是位于用户与操作系统之间的一层数据管理软件,和操作系统一样是计算机的基础软件,也是一个大型复杂的软件系统

DDL:数据定义功能

DML:数据操纵功能(增删改查)

DCL:完整性,安全性,可恢复性,并发控制性

不同数据库软件差异就在DCL

数据库系统(DBS)

数据库系统(DataBase System,DBS):由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员(DataBase Administrator,DBA)组成的存储、管理、处理和维护数据系统

包括了硬件、软件、人员,是个庞大的系统

数据库系统的特点

(1)数据结构化

不光数据内部有结构,数据与数据之间也是有结构的,整体有结构

(2)数据的共享性高、冗余度低且易扩充

数据可以被多个用户、应用共享使用,大大减少冗余,避免数据的不一致性

(3)数据独立性高

数据与使用数据的应用程序之间有一定的独立性,当数据的结构发生改变,应用程序不必修改依然可以访问数据

(4)数据由数据库管理系统统一管理和控制

数据模型

作用

将现实世界抽象到机器世界:建立模型,抽取关键特征

数据模型(data model)也是一种模型,他是对现实世界数据特征的抽象

由于计算机不可能直接处理现实世界中的具体事物,所以人们必须事先把具体事物转换成计算机能够处理的数据

在数据库中用数据模型这个工具来抽象、表示和处理现实世界中的数据和信息

现有的数据库系统均是基于某种数据模型的。数据模型是数据库系统的核心和基础

两类数据模型

两类数据模型:概念模型,机器世界的数据模型(逻辑模型和物理模型)

概念模型

概念模型是从现实世界到机器世界的一个中间层次

按用户的观点对数据和信息进行建模,完全不涉及信息在计算机中的表示,主要用于数据库设计

强调了数据的含义,数据的解释


建立概念模型的目的:

按用户的观点对数据和信息建模

这类模型强调其语义表达能力,它要能较方便地、直观地表达应用中各种语义知识,如被描述对象的意义和相互关系等

是用户和数据库设计人员之间进行交流与沟通的工具


表示方法:实体联系方法

逻辑模型和物理模型

按计算机系统的观点组织数据,主要描述数据的结构特点和结构约束,并非数据本身的内涵

即关心怎样在机器中存取数据

逻辑模型

逻辑模型是按计算机系统的观点对数据建模,主要用于DBMS的实现。主要包括层次模型、网状模型、关系模型、面向对象数据模型、对象关系数据模型、半结构化数据模型等

逻辑模型由概念模型转化而来

物理模型

物理模型是数据在计算机中的存储方式,是对数据最低层的抽象,它描述数据在系统内部的表示方式和存取方法,在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的

信息世界的基本概念

实体(Entity):客观存在并可相互区分的事物

实体集(EntitySet):同类型实体的集合。每个实体集必须命名

属性(Attribute):实体所具有的特征和性质

属性值(AttributeValue):为实体的属性取值

域(Domain):属性值的取值范围

码(Key):唯一标识实体集中一个实体的属性或属性集

实体型:表示实体信息结构,由实体名及其属性名集合表示。如:学生(学号,姓名,性别,年龄)

联系:在现实世界中,事物内部以及事物之间是有联系的,这些联系在信息世界中反映为实体型内部的联系和实体型之间的联系

两个实体集之间的关系

概念模型的表示方法

实体-联系方法

实体型——用矩形框表示,实体集名子写在框中

联系——用菱形框表示,联系名写在框中,用无向边与相关实体集连接,并注明联系类型

属性——用椭圆表示,属性名写在椭圆中,如果为码属性,其名字带下划线。用无向边将实体集和它的全部属性连接起来

若联系也有属性,把属性和菱形用无向边连起来

逻辑模型

逻辑模型组成要素

逻辑模型由数据结构、数据操作和数据的完整性约束条件三部分组成

数据结构:描述数据库的组成对象以及对象之间的联系

数据操作:对数据库中各种对象的实例允许执行的操作的集合,包括操作及有关的操作规则

数据的完整性约束条件:一组完整性规则,给定的数据模型中数据及其联系所具有的制约和依存规则

常用的逻辑模型

层次模型(树)

优点:结构简单

缺点:结点之间的多对多联系表示不自然;对插入和删除操作的限制多,应用程序的编写比较复杂;查询子女结点必须通过双亲结点

网状模型(图)

优点:直接,效率高

缺点:结构复杂,不易使用

关系模型(表)

规范化二维表


面向对象数据模型

对象关系数据模型

半结构化数据模型

关系模型

关系必须是规范化的,满足一定的规范条件

最基本的规范条件:关系的每一个分量必须是一个不可分的数据项

三大类完整性约束:实体完整性、参照完整性和用户定义的完整性

数据操作是集合操作,操作对象和操作结果都是关系,即若干元组的集合

优点:建立在严格的数学概念的基础上:集合代数;关系模型的概念单一:关系;关系模型的存取路径对用户隐藏:更好的安全保密性

缺点:存取路径对用户隐藏,查询效率往往不如格式化数据模型

数据库系统结构

从系统观点

三级模式结构

从用户观点

C/S(独立运算能力),B/S,C+B/S

型和值的概念

型(Type):对某一类数据的结构和属性的说明

值(Value):是型的一个具体赋值

模式和模式的实例

模式

数据库逻辑结构和特征的描述

是型的描述

反映的是数据的结构及其联系

模式是相对稳定的

模式的实例

模式的一个具体值

反映数据库某一时刻的状态

同一个模式可以有很多实例

实例随数据库中的数据的更新而变动

数据库三级模式结构

模式(逻辑模式)

也称逻辑模式,数据库中全体数据的逻辑结构和特征的描述,所有用户的公共数据视图

一个数据库只有一个模式


模式的地位

是数据库系统模式结构的中间层,与数据的物理存储细节和硬件环境无关,与具体的应用程序、开发工具及高级程序设计语言无关

数据怎么存储,怎么使用,模式都不描述

模式的定义

定义数据的逻辑结构(数据项的名字、类型、取值范围等)

定义数据之间的联系

定义数据有关的安全性、完整性要求

外模式(子模式,用户模式)

也称子模式,用户模式,数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,数据库用户的数据视图,是与某一应用有关的数据的逻辑表示

主要针对用户的使用

外模式的地位

介于模式与应用之间

模式与外模式的关系

模式与外模式的关系:一对多

外模式通常是模式的子集

一个数据库可以有多个外模式

内模式(存储模式)

也称存储模式,是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式

一个数据库只有一个内模式

关系数据库对三级模式结构的支持

模式:基本表

外模式:视图

内模式:存储文件

数据库系统的两层映像

外模式/模式映像

定义外模式与模式之间的对应关系

每一个外模式都对应一个外模式/模式映象

映象定义通常包含在各自外模式的描述中


逻辑变了:改了数据表的定义

保证数据的逻辑独立性

当模式改变时,数据库管理员修改有关的外模式/模式映象,使外模式保持不变

应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性

模式/内模式映像

模式/内模式映象定义了数据全局逻辑结构与存储结构之间的对应关系

数据库中模式/内模式映象是唯一的

该映象定义通常包含在模式描述中


物理结构变了:换了个盘存

保证数据的物理独立性

当数据库的存储结构改变了(例如选用了另一种存储结构),数据库管理员修改模式/内模式映象,使模式保持不变

应用程序不受影响,保证了数据与程序的物理独立性,简称数据的物理独立性

总结

外模式/模式映像保证了数据的逻辑独立性

模式/内模式映像保证了数据的物理独立性

数据库系统组成

硬件

软件

人员

关系数据库

基于集合的观点

从域开始,笛卡尔积,子集就是关系,关系模式,五元组

本章重点

区分与理解四个概念:超码、候选码、主码、外码

超码:若关系中的某一个或多个属性的集合能唯一地标识一个元组,则称该属性或属性组为超码(主码或包含主码的属性组)

候选码:如果构成超码属性组的任意真子集都不能成为超码,这样的最小超码称为候选码(单独一个主码)

主码:若一个关系有多个候选码,则选定其中一个为主码。候选码的诸属性称为主属性

外码:设F是基本关系R的一个或一组属性,但不是关系R的主码。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的外码

理解数据库为什么要有完整性

通过对关系(二维表)中取值的约束,可以保证数据库的完整性,保证数据的正确性

实体完整性规则、参照完整性规则,规则的具体内容及为什么要这样制定规则

实体完整性:主码不能为空

参照完整性:外码要么为空,要么为被参照关系中某元素的主码值

通过对关系(二维表)中取值的约束,可以保证数据库的完整性,保证数据的正确性

关系代数运算的灵活运用

关系数据结构及形式化定义

关系

关系:笛卡尔积的有限子集

域:是一组具有相同数据类型的值的集合

笛卡尔积:

超码:若关系中的某一个或多个属性的集合能唯一地标识一个元组,则称该属性或属性组为超码(主码或包含主码的属性组)

候选码:如果构成超码属性组的任意真子集都不能成为超码,这样的最小超码称为候选码(单独一个主码)

主码:若一个关系有多个候选码,则选定其中一个为主码。候选码的诸属性称为主属性

基本关系的性质

关系模式

关系模式是对关系的描述

五元组

R ( U, D, dom, F )

F从需求分析来,要是不合适就用规范化理论消除

R为关系名,U为组成该关系的属性名集合,D为属性组U中属性所来自的域,dom为属性向域的映象集合,F为属性间数据的依赖关系集合

简记为R(U)

选定一个DMBS后,可以把五元组简化为三元组:R(U,F)

因为D,dom是系统提供

关系模式与关系

关系模式是型,关系是值

关系是关系模式在某一时刻的状态或内容

关系模式是静态的、稳定的,关系是动态的、随时间变化的

关系完整性

实体完整性:主码不能为空

参照完整性:外码要么为空,要么为被参照关系中某元素的主码值

用户定义完整性

通过对关系(二维表)中取值的约束,可以保证数据库的完整性,保证数据的正确性

关系代数

关系代数运算三要素

运算对象:关系

运算结果:关系

运算符

关系运算符

专门的关系运算

选择

投影

连接

选择
投影

先做选择再做投影

连接
\(\theta\)连接

给定条件

等值连接

条件为相等

自然连接

特殊的等值连接,要求两个关系比较的分量是同名,最后删去重复属性列

条件:有相同的属性

外连接

被舍弃的

SQL概述

为什么要定义标准

随着信息技术不断发展,数据库管理产品越来越多,为了使数据操作有一个共同的约定,ISO就定了一个规范

好处:便于系统开发个性化,便于数据整合,便于系统整合

标准的内涵是什么

规范只是指导性的方案,并不是产品的操作语句

规范分层次级别

层次标准是一种约定,越低越细,越有可执行性;越粗规定什么样的结果

数据库安全性

安全性定义

数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄漏、更改或破坏

是数据库系统DBMS安全,不是数据库加密解密

是数据操作的安全

安全性威胁

非授权用户对数据库的恶意存取和破坏

数据库中重要或敏感的数据被泄露

安全环境的脆弱性

计算机系统安全模型

数据库安全控制策略

自主控制策略:自己定义操作权限和操作范围(授权和回收权限)

强制控制策略:客体主体

Oracle安全性控制

用户管理

用户:连接数据库

只有通过用户验证,用户才能访问数据库

模式

也称作方案,是用户拥有的数据库对象的集合

模式是数据库对象的集合,是用来创建和管理对象的

同名模式,sys模式,public模式

权限管理

权限是指在数据库中执行某种操作的权利

Oracle有两种类型的权限:系统权限和对象权限

系统权限:系统预先定义好的

角色管理

加入角色:为了更有效管理权限(串讲强调)

角色将用户权限归为一组,对权限进行组管理

角色是一组权限的集合

数据库完整性

完整性定义

数据库的完整性指数据的正确性相容性

完整性:确保数据库中的数据正确、一致、有效、相容的一种基础

完整性类型

类型:实体完整性,参照完整性,用户自定义完整性

完整性实现的途径

通过模式定义实现(定义完整性)

通过编程实现,最重要的是触发器(级联更新)

完整性和安全性

完整性和安全性是两个不一样的概念

完整性为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。它检查和控制的防范对象是不合语义的、不正确的数据,防止它们进入数据库

安全性保护数据库防止恶意的破坏和非法的存取。它防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取


完整性命名约束:好维护

数据库恢复技术

恢复技术是衡量系统优劣的重要指标

事务

事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位

事务四个特性(ACID)

原子性(Atomicity):体现在概念上,事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做

一致性(Consistency):是数据库操作中必须遵循的原则,事务执行的结果必须是使数据库从一个一致状态变到另一个一致状态

隔离性(Isolation):对并发执行而言,一个事务的执行不能被其他事务干扰,一个事务内部的操作及使用的数据对其他并发事务是隔离的

持续性(Durability):永久性,一个事务一旦提交,它对数据库中数据的改变就应该是永久性的


可恢复性破坏了事务的一致性

并发控制破坏了隔离性

故障的种类

事务内部的故障

某个事务在运行过程中由于种种原因未运行至正常终止点就夭折了

系统故障

造成系统停止运转的任何事件,使得系统要重新启动

介质故障

介质故障又称为硬故障,这类故障使存储在外存中的数据部分丢失或全部丢失

计算机病毒

各种故障对数据库的影响

一是数据库本身被破坏

二是数据库没有被破坏,但数据可能不正确

恢复的实现技术

数据转储,登记日志文件

恢复操作的基本原理:冗余

利用存储在系统其它地方的冗余数据来重建数据库中已被破坏或不正确的那部分数据

数据转储

转储是指DBA通过DBMS的恢复子系统,将整个数据库复制到磁带或另一个磁盘上保存起来的过程,这些备用的数据称为后备副本或后援副本

转储方法

静态转储与动态转储(转储状态)

静态转储:在系统中无运行事务时进行转储,转储开始时数据库处于一致性状态,转储期间不允许对数据库的任何存取、修改活动

动态转储:转储操作与用户事务并发进行转储期间允许对数据库进行存取或修改

海量转储与增量转储(转储方式)

海量转储: 每次转储全部数据

增量转储: 只转储上次转储后更新过的数据

登记日志文件

日志文件(log)是用来记录事务对数据库的更新操作的文件

日志文件要登记的内容

各个事务的开始标记(begin transaction),各个事务的结束标记(commit或rollback),各个事务的所有更新操作

这里每个事务开始的标记、每个事务的结束标记和每个更新操作均作为日志文件中的一个日志记录

日志文件用途

事务故障恢复和系统故障恢复必须用日志文件

动态转储方式中必须建立日志文件,后援副本和日志文件综合起来才能有效地恢复数据库

在静态转储方式中,也可以建立日志文件

恢复策略

事务故障恢复

事务故障的恢复由系统自动完成,不需要用户干预

系统故障恢复

系统故障的恢复由系统在重新启动时自动完成,不需要用户干预

Undo,Redo

介质故障恢复

介质故障的恢复需要DBA介入

并发控制

并发控制的主要技术:封锁技术

用于多用户数据库系统

特点:在同一时刻并发执行的事务数可达数百个

问题:会产生多个事务同时存取同一数据的情况,可能会存取和存储不正确的数据

数据不一致性现象

丢失修改

不可重复读

读“脏”数据

引入R(x):读数据x,W(x):写数据x

丢失修改

破坏了事务的隔离性,一致性

不可重复读(无法再现)

破坏了事务的隔离性,一致性

读“脏”数据(读到回滚,不存在的数据)

破坏了事务的隔离性,一致性

结论

结论:不正确的方式调度并发操作会破坏事务的隔离性和一致性,最终导致数据库中数据不正确。

并发控制机制的任务

对并发操作进行正确调度

保证事务的隔离性

保证数据库的一致性

封锁技术

封锁概念

基本封锁类型

排它锁(Exclusive Locks,简记为X锁)

共享锁(Share Locks,简记为S锁)

排它锁(X锁)

若事务T对数据对象A加上排它锁,则只允许T读取和修改A。其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁

共享锁(S锁)

若事务T对数据对象A加上共享锁,则事务T可以读A但不能修改A。其它事务只能再对A加共享锁,而不能加排它锁,直到T释放A上的共享锁

封锁协议

运用封锁方法时,对数据对象加锁时需要约定一些规则:

何时申请X锁或S锁

持锁时间

何时释放封锁等


一级封锁协议

一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放

二级封锁协议

二级封锁协议:在一级封锁协议的基础上增加事务T在读取数据R之前必须先对其加S锁读完后即可释放S锁

三级封锁协议

三级封锁协议:在一级封锁协议的基础上增加事务T在读取数据R之前必须先对其加S锁直到事务结束才释放

封锁协议级别越高,一致性程度越高

丢失修改

不可重复读

读脏数据

活锁死锁

避免活锁

避免活锁:采用先来先服务的策略

解决死锁

预防死锁

死锁的诊断与解除

死锁的预防

预防死锁的发生就是要破坏产生死锁的条件

预防死锁的方法

一次封锁法

顺序封锁法

一次封锁法

一次封锁法:要求每个事务在执行之前必须一次将所有要使用的数据全部加锁,否则就不能继续执行

存在问题:

顺序封锁法

顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁

存在问题:

结论

在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点

DBMS在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法

死锁诊断与解除

有回路就死锁

关系数据理论

关系,关系模式:

关系模式分析

数据冗余:系和系主任的信息出现多次

更新异常:更新系主任的姓名时,该系学生选课记录必须全部更新,否则数据会不一致,开销很大

插入异常:一个系刚成立,还没有学生,Sno就没有,系和系主任的信息就无法插入

删除异常:删除学生选课信息时,也会把系和系主任信息删除

没有“一表一事”原则

规范化

规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常和数据冗余等问题

函数依赖

平凡函数依赖与非平凡函数依赖

完全函数依赖与部分函数依赖

传递函数依赖

范式

NF总结

1NF必须保持的最基本要求,数据项不能再分解

2NF消除了所有非主属性对主属性的部分函数依赖

3NF消除了所有非主属性对主属性的传递函数依赖


构造数据库必须遵循一定的规则,在关系数据库中,这种规则就是范式

从低一级向高一级范式转换的基本思考点

遵照的原则:一事一地原则

解决方法:模式垂直分解

分解注意:保持函数依赖的分解(模式分解不能破坏原来的语义);保持数据不丢失的分解(无损连接,既不能多信息,也不能少信息)

具体做法:将导致产生部分函数依赖的主码与非主属性分离,各自成为一个关系

1NF

1NF的要求:如果一个关系模式R的所有属性都是不可分的基本数据项,则\(R\in 1NF\)

第一范式是关系模式最基本的要求

2NF

2NF的要求:若关系模式$R\(1NF,并且每一个非主属性都完全函数依赖于R的码,则\)R$2NF

如图,主码的真子集也能决定Sdepar,所以存在部分函数依赖

3NF

对表进行优化

遵照“一事一地”原则

解决方法:模式垂直分解

规范化理论总结

模式的分解

模式分解要满足:无损连接性,保持函数依赖

无损连接性

是指分解后的关系通过自然连接可以恢复成原来的关系,即通过自然连接得到的关系与原来的关系相比,既不多出信息、又不丢失信息

保持函数依赖

保持函数依赖分解是指在模式的分解过程中,函数依赖不能丢失的特性,即模式分解不能破坏原来的语义

数据库设计

数据库设计的任务和目标

任务:设计最优的模式

目标:满足各种用户数据组织管理的需求,实现数据共享

数据库设计四张图

数据库设计六个阶段

需求分析阶段(基础,最困难,最耗费时间)

概念设计阶段(关键)

逻辑结构设计阶段

数据库物理设计阶段

数据库实施阶段

数据库运行和维护阶段

数据库设计阶段 目标 任务 方法
需求分析阶段 数据字典 充分了解原系统的工作概况,在此基础上确定新系统的功能 调查用户实际需求,再进一步分析,用SA方法自顶向下分析
概念结构设计 构造E-R图 将需求分析得到的用户需求抽象为概念模型 抽象数据并设计局部视图,集成局部视图,得到全局概念结构
逻辑结构设计 构造数据模型 把概念结构设计阶段设计好的基本E-R图转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构 E-R图向关系模型的转换,数据模型的优化,设计用户子模式
物理结构设计 存储结构与存储方法 为一个给定的逻辑数据模型选取一个最适合应用要求的物理结构 确定数据库物理结构,对物理结构进行评价
数据库实施阶段
数据库运行维护阶段

数据库设计特点

特点:三分技术,七分管理,十二分基础数据

需求分析

需求分析的任务

通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统(手工系统或计算机系统)工作概况,明确用户的各种需求

在此基础上确定新系统的功能。新系统必须充分考虑今后可能的扩充和改变,不能仅仅按当前应用需求来设计数据库

需求分析重点

需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求

信息要求

用户需要从数据库中获得信息的内容与性质

由用户的信息要求可以导出数据要求,即在数据库中需要存储哪些数据

处理要求

要完成什么处理功能

对处理的响应时间的要求

对处理方式的要求(批处理/联机处理)

需求分析方法

自顶向下的结构化分析方法(Structured Analysis,简称SA方法)

SA方法,从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并用数据流程图和数据字典描述系统

数据流程图

数据字典

内容:

数据项

数据结构

数据流

数据存储

处理过程

数据字典与数据流程图

区别:

数据流程图:是一种能全面地描述系统数据流程的主要工具,它用一组符号来描述整个系统中信息的全貌,综合地反映出信息在系统中的流动、处理和存储情况

数据字典:是对数据流程图中的数据项、数据结构、数据流、处理逻辑和数据存储进行定义和描述的工具,也是数据分析和管理工具,同时也是系统设计阶段进行数据库设计的重要依据

联系:

没有数据字典,数据流程图就不严格;没有数据流程图,数据字典也难于发挥作用

只有数据流程图和对数据流程图中每个元素的精确定义放在一起,才能共同构成系统的规格说明

概念结构设计

概念结构设计步骤

自底向上设计步骤:

抽象数据并设计局部视图

集成局部视图,得到全局概念结构

消除冗余

逻辑结构设计

逻辑结构设计任务

逻辑结构设计的任务就是把概念结构设计阶段设计好的基本E-R图转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构

E-R图向关系模型的转换

转换内容

转换原则

一个实体型转换为一个关系模式

一个m:n联系转换为一个关系模式

一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并

一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并

三个或三个以上实体间的一个多元联系转换为一个关系模式

具有相同码的关系模式可合并

物理结构设计

数据库实施与维护

实验考试复习整理

指令总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
建表
create table 表名
(列名 数据类型 约束)

修改表
alter table 表名
add drop modify

删除表
drop table 表名

查询
select * from 表名 where 条件 group by 列名 having 条件 order by 列名 asc/desc

集函数
count, sum, avg, max, min

to_date(): 插入用,如to_date('1997/10/01','yyyy/mm/dd')
to_char(): 求年龄用,如2023-to_char(sbirth,'yyyy')

并交差
union, intersect, minus

插入数据
insert into 表名 values('值')

修改数据
update 表名 set 列名='值' where 条件

删除数据
delete from 表名 where 条件

创建视图
create view 视图名 as
select语句

创建用户
create user 用户名
identified by 密码
default tablespace users
temporary tablespace temp
quota unlimited on users

修改用户
create改成alter
alter user u1
identified by 123456
default tablespace users
temporary tablespace temp
quota unlimited on users

删除用户
drop user 用户名 [cascade]

授予系统权限
grant 系统权限 to 用户/角色 [with admin option]

收回系统权限
revoke 系统权限 from

授予对象权限
grant 对象权限 on 对象 to 用户/角色 [with grant option]

收回对象权限
revoke 对象权限 on 对象 from 用户/角色 [cascade constraints]

创建角色
create role 角色名

修改角色
alter role 角色名

删除角色
drop role 角色名

PL/SQL语句
declare

begin

end;

条件语句
if m<60 then
dbms_output.put_line('不及格');
elsif m>=60 and m<100 then
dbms_output.put_line('及格');
else
dbms_output.put_line('100');
end if;

循环语句
loop
语句
exit when 条件
end loop;

游标
declare
v_sno s.sno%type;
v_sname s.sname%type;
cursor c2(v_dept s.college%type default '信息') is
select sno,sname from s where college=v_dept; //声明游标
begin
open c2(vdept=>'植保'); //打开游标
loop
fetch c2 into v_sno,v_sname; //取数据
exit when c2%notfound;
dbms_output.put_line(v_sno||','||v_sname);
end loop;
close c2; //关闭游标
end;

存储过程
create or replace procedure TP1 is
a s.sno%type;
b s.ssex%type;
c s.college%type;
begin
select sname,ssex,college
into a,b,c
from s
where sno='04001';
dbms_output.put_line(a||b||c);
end TP1;

触发器
create or replace trigger t_track_spj
after update on spj
for each row
declare
x1 number;
begin
x1:=abs(:new.qty-:old.qty)/:old.qty;
if x1 >0.1 then
insert into spj_tra(sno,pno,jno,b_qty,a_qty)
values(:new.sno,:new.pno,:new.jno,:old.qty,:new.qty);
end if;
end t_track_spj;

首先启动Oracle服务

计算机单击右键——管理——服务和应用程序——服务

首先启动TNS监听服务,再启动service服务,这样就能登录了

用sys登录数据库新建用户

连接为选SYSDBA

数据库选ORCL

新建user先赋予DBA权限

数据定义

创建表

可以用GUI创建表,然后用右下角查看SQL复制粘贴

修改表

删除表

注:drop可以drop表,也可以drop列,但drop列要跟在alter table后

查询语句

单表查询

选择表中的若干列

查询指定列:select sname from s

查询全部列:select * from s

查询经过计算的值(如查询年龄):select sname 学生姓名,2023-to_char(sbirth,'yyyy') as 年龄 from s

注:

to_char()函数有两个参数,第一个参数为进行运算的值,第二个参数是一些设置(如取年月日中的哪一部分,年'yyyy',月'mm',日'dd'

给列起别名有两种:直接加空格,然后写别名,或者as后面跟别名,别名不需要用' '包起来(用单引号引起来的是字符)

选择表中若干元组

Distinct

Distinct关键字:取消取值重复行

如sc表中找学号

会出现重复,所以就要用到Distinct关键字:select distinct sno from sc

where

注:

等于不是两个等号,是一个等号

比较符号前加not,为取反

确定集合:select * from sc where grade in (60,70,80,90,100),可以查到成绩在这个集合里的值,比or简单一些


字符匹配like

通配符可以代表任意字符:%代表任意长度(包括0)的字符串,_代表任意单个字符

1
2
select * from s where sname like '张%'		//找到所有姓张的
select * from s where sname like '王__' //找到所有姓王,名字是3个字的

转义字符:当要查找的字符串里本来就含有%或_时,用转义字符

1
select * from c where cname like 'DB/_%i__' escape '/'


涉及空值,用is nullis not null,不能用= null代替

对查询结果排序

ASC: ascend

DESC: descend

1
select sno,grade from sc where sno='003' order by grade desc

使用集函数

distinct:取消重复行

例题

COUNT:

考虑到一个学生会选很多门课,所以要加distinct

1
select count(distinct sno) from sc

AVG:

1
select avg(grade) from sc where cno='001'

对查询结果分组

分组:值相等的为一组,分组后可以进一步统计

用到group by后,select后面出现的属性列的列名,只能是分组的列名或集函数

group by字句后,还可以用having字句做进一步筛选

例题

查询各个供应商号及其供应了多少类零件

用sno分组后如图,分为5组:

每组会有相同的sno,但是其他值一般都不同

一个供应商会给不同工程供应相同零件,所以零件种类pno要有distinct

1
select sno,count(distinct pno) from spj group by sno

查询供应了2类以上零件的供应商号

1
select sno from spj group by sno having count(distinct pno)>2

注:where和having使用的不同

虽然都是用来写条件,where是分组之前,对表中的元组进行筛选,作用对象是基本表;而分组以后的结果进一步筛选,用having

连接查询

同时查阅2个以上的表:连接查询

等值与非等值连接查询

=实现自然连接

一般来说,两张表先用自然连接,再往后加条件

自身连接查询

1
select a.sno from sc a, sc b where a.sno=b.sno and a.cno='001' and b.cno='003'

查询每门课的先修课:

1
select first.cno,second.cpno from c first, c second where first.cpno=second.cno and second.cpno is not null

外连接查询

复合条件连接查询

where含有多个条件

集合查询

Oracle中差操作用到MINUS

并操作

1
2
3
select sno from sc where cno='001'
union
select sno from sc where cno='003'

交操作

差操作

数据更新

如果想立即看到结果,就得加commit;语句,并且语句和commit;之间有分号;

alter table:主要用于修改表的结构,和表中数据无关(可以加列,加新的完整性约束)

update:修改表中的数据,与表结构无关

drop:对数据类型做删除

delete:删除表中一行数据,不会对表结构造成影响

插入数据

插入单个元组

例如:

1
insert into s values('04050','陈东','男',to_date('1997/10/01','yyyy/mm/dd'),'信息学院') 

注:to_date()函数有两个参数:第一个参数是要插入的具体日期,第二个是日期的格式

也可以

1
2
insert into s(college,ssex,sno,sname,sbirth) 
values('信息学院','男','04050','陈东',to_date('1997/10/01','yyyy/mm/dd'))

插入子查询结果

修改数据

例:

1
update s set college='外语系' where sno='04001'
1
update s set sbirth=sbirth-365 where college='信息'

注:日期型可以直接拿来算数运算,以天为单位


带子查询的update:

1
2
update sc set grade=100 where sc.sno in 
(select sno from s where college='信息')

删除数据

注:delete删的是元组


例题

1
2
3
delete from sc where sno='04009';
delete from s where sno='04009';
commit;

但可能会违反参照完整性

所以必须先删除参考表的值


1
2
delete from sc where sno in
(select sno from s where college='信息')

Oracle安全性控制

用户管理

创建用户

注:创建的新用户甚至没有登陆权限

1
2
3
4
5
create user u1
identified by 123456
default tablespace users
temporary tablespace temp
quota unlimited on users

但是是不能登录,因为没登录权限

修改用户

create换成alter

删除用户

需要有drop user权限

如果不指定cascade,而且用户已经创建表了之后,会报错:必须指定cascade

模式

模式概念

模式选择与切换

模式对象与非模式对象

模式和用户

权限管理

系统权限

create session:登录数据库权限

create table:创建表

create any table:在任何用户模式创建表

授予用户系统权限

with admin option: 用户还可以把这个权限授予其他用户

首先得授予用户create session权限

在别的用户模式下建表:表名前加模式名.

1
grant create session, create any table, select any table to u1
回收用户系统权限

对象权限

授予对象权限

注:对象权限with grant option与系统权限对比:with admin option

on后面只能跟一个对象,不能跟多个对象

1
grant all privileges on s to u1,u2
1
grant select,update(sno) on s to u3 with grant option
回收对象权限

如果授予的时候加了with grant option,收回的时候就要有cascade constraints

角色管理

Oracle数据库编程

PL/SQL简介

变量及数据类型

在Oracle中,赋值为:=

好用的数据类型: %type

例子:

1
2
3
4
5
6
7
8
9
10
11
declare
m sc.sno%type;
n sc.cno%type;
t sc.grade%type;
begin
m := '01323';
n := '777';
t := 100;
insert into s values(m,n,t);
commit;
end;

注:declare和begin后面无;

end后面才有;

中间每一条语句都有;

运算符与表达式

=>用于给形参赋值

..用于for循环

||连接字符串

流程控制语句

条件语句

注意:IF后面跟THENELSIF写法,END IF;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
declare
m sc.grade%type;
begin
select grade into m
from sc
where sno='04001' and cno='003';
if m<60 then
dbms_output.put_line('不及格');
elsif m>=60 and m<100 then
dbms_output.put_line('及格');
else
dbms_output.put_line('100');
end if;
end;

注:PL/SQL中的select可以into到变量里

循环语句

例如

1
2
3
4
5
6
7
8
9
declare
x number(2):= 0
begin
loop
x:=x+1;
dbms_output.put_line('x现在的值是'||x);
exit when x=10;
end loop;
end;

游标

概念

在一段程序中处理所有查询结果

游标使用步骤

声明游标
打开游标

执行游标的查询语句,然后存储在内存中

提取游标数据

fetch关键字,游标下移并取值

重复取值:循环

循环结束:c1%notfound(c1为游标名)

关闭游标

close c1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
declare
v_sno s.sno%type;
v_sname s.sname%type;
cursor c2(v_dept s.college%type default '信息') is
select sno,sname from s where college=v_dept;
begin
open c2(vdept=>'植保');
loop
fetch c2 into v_sno,v_sname;
exit when c2%notfound;
dbms_output.put_line(v_sno||','||v_sname);
end loop;
close c2;
end;

存储过程

一般都加or replace

例题

存储过程中的变量声明在is后begin前

1
2
3
4
5
6
7
8
9
10
11
create or replace procedure TP1 is
a s.sno%type;
b s.ssex%type;
c s.college%type;
begin
select sname,ssex,college
into a,b,c
from s
where sno='04001';
dbms_output.put_line(a||b||c);
end TP1;

调用:

1
2
3
begin
TP1;
end;

带参数并用游标的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create or replace procedure TP1(v_col s.college%type)
is
v_sname s.sname%type;
v_cname c.cname%type;
v_grade c.grade%type;
cursor c1 is
select sname,cname,grade from s,sc,c where s.sno=sc.sno and c.cno=sc.cno and college=v_col;
begin
open c1;
loop
fetch c1 into v_sname,v_cname,v_grade;
exit when c1%notfound;
dbms_output.put_line(v_sname||v_cname||v_grade);
end loop;
close c1;
end TP1;

注意游标的关闭

触发器

触发事件:insert, delete, update

for each row: 行触发器(修改许多行元组,触发器执行若干次)

例:GPA换算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
create or replace trigger t1
before insert or update on sc
for each row
begin
if :new.grade>=90 and :new.grade <=100 then
:new.gpa:=4.0;
elsif :new.grade>=85 and :new.grade <=89 then
:new.gpa:=3.7;
elsif :new.grade>=82 and :new.grade <=84 then
:new.gpa:=3.3;
elsif :new.grade>=78 and :new.grade <=81 then
:new.gpa:=3;
elsif :new.grade>=75 and :new.grade <=77 then
:new.gpa:=2.7;
elsif :new.grade>=71and :new.grade <=74 then
:new.gpa:=2.3;
elsif :new.grade>=68 and :new.grade <=70 then
:new.gpa:=2;
elsif :new.grade>=65 and :new.grade <=67 then
:new.gpa:=1.7;
elsif :new.grade>=62 and :new.grade <=64 then
:new.gpa:=1.3;
elsif :new.grade>=60 and :new.grade <=61 then
:new.gpa:=1.0;
else
:new.gpa:=0;
end if;
end t1;

例:当对spj表的供应量qty属性值进行修改时,若供应量的变化范围超过10%,自动将修改的数据情况记录到另一个表spj_tra(sno,pno,jno,b_qty,a_qty)中,其中sno、pno、jno是被修改的元组的供应商号、零件号和工程号,b_qty是修改前的供应量,a_qty是修改后的供应量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
创建spj_tra表格:
create table spj_tra(
sno varchar2(10) ,
pno varchar2(10) ,
jno varchar2(10) ,
b_qty number,
a_qty number);

创建触发器:
create or replace trigger t_track_spj
after update on spj
for each row
declare
x1 number;
begin
x1:=abs(:new.qty-:old.qty)/:old.qty;
if x1 >0.1 then
insert into spj_tra(sno,pno,jno,b_qty,a_qty)
values(:new.sno,:new.pno,:new.jno,:old.qty,:new.qty);
end if;
end t_track_spj;





参考资料

课程PPT

实验视频