《数据库》重要知识点
作者 | 内容 | 发布时间 | 博客地址 | Github |
---|---|---|---|---|
Trae1ounG | 数据库复习 | 2023/6/3 | Trae1ounG的博客_优快云博客-软件测试,计算机组成原理,数据库领域博主 | GitHub - Trae1ounG/Final_Review_Book: 计组期末复习汇总 |
第一章
数据模型、数据库系统概念
数据库特点:
1)数据不重复存放 2)可支持多个应用并发访问 3)数据结构独立于应用程序 4)对数据的增、删、查、改均由数据库系统管理软件进行管理和控制。
数据模型
数据模型是指描述事物对象数据特征及其结构的形式化表示,包含数据结构、数据操作、数据约束3个部分组成。
1)数据结构: 用于描述事物对象的静态特征,包括事物对象的数据组成、数据类型、数据性质等。
2)数据操作:用于描述事物对象的动态特征,包括数据的插入、修改、删除和查询等访问操作。
3)数据约束:用于描述数据结构中数据之间的语义联系、数据之间的制约和依存关系,以及数据动态变化的规则等。
数据库使用的数据模型
-
层次数据模型
-
优点: 1)层次清晰 2)结点更新容易 3)检索查询效率高 缺点: 1)结构单一 2)相同信息多次存储、数据冗余大 3)不适合于具有拓扑空间的数据组织
-
-
网状数据模型
-
优点: 1)容易表达数据间的复杂关系 2)冗余小 缺点: 1)结构复杂、定位难 2)需要定位指针
-
-
关系数据模型
-
关系数据模型优点: 数据结构简单、操作灵活 支持关系与集合运算操作 支持广泛使用的SQL数据库操作语言标准 容易实现与应用程序的独立性
-
关系数据模型局限: 只用于结构化数据的组织与存储管理 支持的数据类型较简单 难以支持互联网广泛应用的非结构化数据和复杂数据管理
-
-
其它数据模型(如对象数据模型、键值对数据模型、列式数据模型、文档数据模型、图形数据模型等)
数据库系统
数据库系统(Database Systems)是一类基于数据库进行数据管理与信息服务的软件系统。
数据库系统由用户、数据库应用程序、数据库管理系统和数据库四个部分组成。
数据库用户(Users)是指数据库系统的使用人员。
数据库应用程序是一种在DBMS支持下对数据库中数据进行访问处理的应用程序。
数据库管理系统(Database Manage System,DBMS )——是一种专门用来创建数据库、管理数据库、维护数据库,并提供外部对数据库进行访问的系统软件。
数据库(Database)是一种依照特定数据模型组织、存储和管理数据的文件集合。
NoSQL数据库和NewSQL数据库有何区别?
-
NoSQL
术语NoSQL将数据库归类为描述性数据库,如“No-SQL”。NoSQL是一个全面的数据库类别,旨在克服SQL数据库产生的问题。它们被称为无模式文档,它们以文档、图形、键值和非有序方式存储数据。
NoSQL的优点:
-
当需要动态行为时,它们比传统系统更好地扩展。
-
这些系统针对非关系数据进行了更好的优化。
-
允许执行写入时架构操作。
NoSQL的缺点:
-
使用NoSQL构建的系统基本上是非事务性的。
-
创建的数据量巨大,不提供任何传统的数据库功能。
-
当同时执行多个事务时,它不遵循一致性。
-
NewSQL
术语NewSQL对数据库进行分类,这些数据库是关系模型与可扩展性的进步,数据类型的灵活性的组合。这些数据库专注于NoSQL中不存在的功能,这提供了强大的一致性保证。这涵盖了两层数据,一层关系数据和键值存储。
NewSQL的优点:
-
它为传统的关系数据库引入了新的实现。
-
它汇集了SQL和NoSQL的优势。
-
在用户的类型和需求之间迁移很容易。
NewSQL的缺点:
-
它们提供对丰富传统系统的部分访问。
-
它可能会导致内存中体系结构出现问题,以超过数据量。
-
这种数据库的核心基础是关系系统,这使得理解变得棘手。
结构化数据与非结构化数据有何区别?
-
数据类型不同:
结构化数据是具体的数据,包括数字、日期、文本等。这些数据可以轻易地映射到表格、关系型数据库或其他结构化数据存储系统中。而非结构化数据则包括图片、音频、视频、电子邮件、社交媒体帖子等不规则、无固定格式和规则的数据,很难用表格或关系型数据库来存储和处理。
-
存储方式不同:
结构化数据通常以表格的形式存储在数据库中,可以通过SQL等查询语言进行检索。而非结构化数据的存储比较灵活,可以存在文件系统、云存储等地方。
-
处理方式不同:
结构化数据使用传统的数据库管理系统可以快速处理,非结构化数据需要使用特殊的技术,例如机器学习、自然语言处理等,才能对其进行分析和处理。
为什么关系数据库不适合大数据应用处理?
关系数据模型局限: 只用于结构化数据的组织与存储管理 支持的数据类型较简单 难以支持互联网广泛应用的非结构化数据和复杂数据管理
数据库应用系统生命周期
数据库管理系统类型
第二章
关系及其相关概念
实体(entity)——是指包含有数据特征的事物对象在概念模型世界中的抽象名称。
关系(relation)——是指具有关系特征、用于存放实体数据的二维表。关系也常被称为关系表。
表中每行存储实体的一个实例数据 表中每列包含实体的一项属性数据 表中单元格只能存储单个值 不允许有重复的行 不允许有重复的列 列顺序可任意 行顺序可任意
在关系中,可以用来唯一标识元组的属性列,称为键(Key),其它属性列都为非键列。
复合键(Compound Key)——是指关系中用来唯一标识元组的多列作为键。
候选键(Candidate Key)——关系中可能有多个列均适合作为键,将其中每个都称为候选键。
主键(Primary key)是关系表中最有代表性的一个候选键,每个关系表中只能定义一个主键。
主键作用: 唯一标识关系表的每行(元组) 与关联表的外键建立联系,实现关系表之间连接 数据库文件使用主键值来组织关系表的数据存储 数据库使用主键索引快速检索数据
代理键——采用DBMS自动生成的数字序列作为关系表的主键。
由DBMS自动生成的数字序列作为主键,可替代复合主键,以便获得更高性能的数据访问操作处理。
关系模型原理
关系模型(Relation Model)——是一种基于二维表结构存储数据实体及实体间联系的数据模型。
集合运算操作包括选择(select)、投影(project)、连接(join)、交(intersection)、并(union)、差(difference)等。
专门针对元组的关系操作包括数据行插入(Insert)、 修改(Update)、删除(Delete)操作。
数据关系约束
在关系模型中,数据关系约束是指关系表中实体数据完整性、关联表之间数据一致性等要求,一般由业务需求来确定。
在关系模型中,可定义关系表的数据约束如下: 属性列取值类型 属性列取值范围 属性列取值是否唯一 属性列是否允许空值 关联表的参照完整性约束
关系模型数据操作
练习:关系R与关系S的数据见下表所示,请分别给出R∪S、R∩S、R-S运算的结果数据
R∪S运算
R∩S运算
R—S运算
传统的集合运算 并、差、交、广义笛卡尔积 专门的关系运算 选择、投影、连接、除
专门的关系运算
选择:
σF(table) - > 根据F的判断条件,对table表进行选择
等同于SELECT * FROM table WHERE F;
示例:σSage < 20(Student)
投影:从R中选择出若干属性列组成新的关系
查询学生的姓名和所在系 即求Student关系上学生姓名和所在系两个属性上的投影 π(Sname,Sdept)(Student)
投影和选择相对简单
连接:从两个关系的笛卡尔积中选取属性间满足一定条件的元组
连接运算从R和S的广义笛卡尔积R×S中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较关系的元组。
-
等值连接(equijoin)
-
从关系R与S的广义笛卡尔积中选取A、B属性值相等的那些元组
-
-
自然连接(Natural join)
-
自然连接是一种特殊的等值连接
-
两个关系中进行比较的分量必须是相同的属性组
-
在结果中把重复的属性列去掉
-
象集:它表示R中属性组X上值为x的诸元组在Z上分量的集合
a1的象集为 {(b1,c2),(b2,c3),(b2,c1)}
a2的象集为 {(b3,c7),(b2,c3)}
a3的象集为 {(b4,c6)} a4的象集为 {(b6,c6)}
除:除操作是同时从行和列角度进行运算
如给出两个关系R和S
R÷S步骤
首先求出R中和S不同的属性的象集
检查S中有哪些属性集合
R中有哪些可以包含S的属性集合
选择满足的,投影R-S的列
如果使用
至少
,一定使用除法
第三章
SQL语言语句类型
数据定义语言
数据定义语言(Data Definition Language,DDL)是SQL语言中用于创建、修改或删除数据库对象的语句。
-
CREATE DATABASE
-
DROP DATABASE
-
ALTER DATABASE
-
CREATE TABLE
-
ALTER TABLE
-
DROP TABLE
-
CREATE INDEX
-
DROP INDEX
数据操纵语言
数据操纵语言(Data Manipulation Language,DML)是SQL语言中用于增添、修改、删除数据的语句。
-
INSERT
-
UPDATE
-
DELETE
数据查询语言
数据查询语言(Data Query Language,DQL)是SQL语言中用于对数据库进行数据查询的语句。
数据控制语言
数据控制语言(Data Control Language,DCL)是用于对数据库对象访问权进行控制的SQL语句。
-
GRANT – 授予用户对数据库对象的权限
-
DENY – 拒绝授予用户对数据库对象的权限
-
REVOKE – 撤消用户对数据库对象的权限
事务处理语言
事务处理语言(Transaction Process Language,TPL)是SQL语言中用于
-
BEGIN TRANSACTION – 开始事务
-
COMMIT – 提交事务
-
ROLLBACK – 回滚事务数据库内部事务处理的语句。
游标控制语言
游标控制语言(Cursor Control Language,CCL)是SQL语言中用于数据库游标操作的语句。
-
DECLARE CURSOR – 定义游标
-
FETCH INTO – 提交游标数据
-
CLOSE CURSOR– 关闭游标
SQL语言基本数据类型
字符:CHAR、VARCHAR、TEXT 整数:SMALLINT、INTEGER 浮点数:NUMBER(n,d)、FLOAT(n,d) 日期:DATE、DATETIME 货币:MONEY
数据定义语句
'''创建数据库''' CREATE DATABASE XXX '''修改数据库''' ALTER DATABASE XXX RENAME TO XXX1 '''删除数据库''' DROP DATABASE XXX '''创建表''' CREATE TABLE XX ( name varchar(30) not null, age varchar(10) primary key, 名字 类型 完整性约束 ); ''' 完整性约束包括: PRIMARY KEY 主键 NOT NULL 非空 NULL 空值 UNIQUE 值唯一 CHECK 有效性检查 DEFAULT 缺省 注意CHECK 和 DEFAULT 的用法 ''' '''假定创建一个表,City字段只能取值上海、北京,age 默认为 10''' CREATE TABLE TEST( City varchar(10) CHECK(City IN('上海','北京')), Age int NOT NULL DEFAULT 10 ); ''' 注意CHECK!! CHECK(字段名 IN ('选择1','选择2')) ''' ''' 主键定义方式1:直接跟PRIMARY KEY ,只能定义单列主键 主键定义方式2:使用表约束的方式定义 在字段声明的最后进行 ''' CREATE TABLE TEST( Idx int, City varchar(10) CHECK(City IN('上海','北京')), Age int NOT NULL DEFAULT 10, CONSTRAINT Idx_pk PRIMARY KEY(Idx) ); ''' 默认格式为:CONSTRAINT 键名 PRIMARY KEY(作为主键的列,可以是多个) 这样便于定义复合主键、命名主键约束、便于定义代理键 若要定义代理键: 代理键——采用DBMS自动生成的数字序列作为关系表的主键 只需要保证代理键的类型为Serial ''' CREATE TABLE TEST1( Idx serial,'''此时Idx为代理键''' City varchar(10) CHECK(City IN('上海','北京')), Age int NOT NULL DEFAULT 10, CONSTRAINT Idx_pk PRIMARY KEY(Idx) ); ''' 定义外键 操作同上 ''' CREATE TABLE TEST( Idx serial primary key, CONSTRAIN Idx_FK FOREIGN KEY(Idx) REFERENCES TEST1(Idx) ON DELETE CASCADE ); ALTER TABLE <表名> ADD <新列名称><数据类型>|[完整性约束] ALTER TABLE<表名> DROP COLUMN <列名>; ALTER TABLE<表名> DROP CONSTRAINT<完整性约束名>; ALTER TABLE <表名> RENAME TO <新表名>; ALTER TABLE <表名> RENAME <原列名> TO <新列名>; ALTER TABLE <表名> ALTER COLUMN <列名> TYPE<新的数据类型>; DROP TABLE <表名>;
索引
索引(Index)是一种按照关系表中指定列的取值顺序组织元组数据存储的数据结构,使用它可以加快表中数据的查询访问。
索引作用:支持对数据库表中数据快速查找,其机理类似图书目录可以快速定位章节内容。
索引优点:
-
提高数据检索速度
-
可快速连接关联表
-
减少分组和排序时间
索引开销:
-
创建和维护索引都需要较大开销
-
索引会占用额外存储空间
-
数据操纵因维护索引带来系统性能开销
CREATE INDEX <索引名> ON <表名><(列名)>; CREATE INDEX Birthday_Idx ON STUDENT (Birthday); ALTER INDEX <索引名> <修改项>; ALTER INDEX <索引名> RENAME TO <新索引名>; '''例 在学生信息表Student中,将原索引Birthday_Idx更名为Bday_Idx,其索引修改SQL语句如下:''' ALTER INDEX Birthday_Idx RENAME TO Bday_Idx; DROP INDEX <索引名> ;
数据操纵语句
数据插入SQL语句
INSERT INTO <表名|视图名>[<列名表>] VALUES (列值表); INSERT INTO Student VALUES('2017220101105','柳因','女','1999-04-23','软件工程', 'liuyin@163.com');
数据更新SQL语句
UPDATE <表名|视图名> SET <列名1>=<表达式1> [,<列名2>=<表达式2>...] [WHERE <条件表达式>]; UPDATE Student SET Email='zhaodong@163.com' WHERE StudentName='赵东';
数据删除SQL语句
DELETE FROM <表名|视图名> [WHERE <条件表达式>]; DELETE FROM STUDENT WHERE StudentName='张亮';
数据查询SQL语句
SELECT [ALL|DISTINCT] <目标列>[,<目标列>…] [ INTO <新表> ] FROM <表名|视图名>[,<表名|视图名>…] [ WHERE <条件表达式> ] [ GROUP BY <列名> [HAVING <条件表达式> ]] [ ORDER BY <列名> [ ASC | DESC ] ]; ''' 为了在结果集中过滤重复数据,可以在查询语句的输出列前加入DISTINCT关键字,其执行结果如下。 ''' SELECT DISTINCT Major FROM student;
Where条件子句
SELECT * FROM STUDENT WHERE BirthDay BETWEEN ‘2000-01-01’ AND ‘2000-12-30’; SELECT * FROM STUDENT WHERE Email LIKE ’%@163.com’;
在SQL查询Where子句中,还可以使用多个条件表达式,并通过逻辑运算符(AND、OR、NOT)连接操作,以及使用IN或NOT IN关键词,进一步限定结果集的数据范围。
SELECT StudentID, StudentName, StudentGender, Major FROM STUDENT WHERE Major=’软件工程’ AND StudentGender=’男’; SELECT StudentID, StudentName, StudentGender, Major FROM STUDENT WHERE Major IN ('计算机应用');
对结果集进行排序
在SELECT查询语句返回的结果集中,行的顺序是任意的。如果需要结果集排序,可以在SELECT语句中加入ORDER BY关键字。
SELECT * FROM STUDENT ORDER BY Birthday DESC; ''' 在默认情况下,SQL查询的结果集是按指定列值的升序排列。可以使用关键词ASC和DESC选定排序是升序或降序。 如果结果集需要按多个列排序,可以分别加入关键字ASC或DESC改变。 例 若要将STUDENT表查询数据,首先按出生日期降序排列,然后按姓名升序排列,其数据查询SQL语句如下: ''' SELECT * FROM STUDENT ORDER BY Birthday DESC , StudentName ASC;
SQL内置函数类型
典型SQL内置函数类型如下:
-
聚合函数
-
聚合函数是一些对关系表中数值属性列进行计算并返回一个结果数值的函数。
-
聚合函数 功能 AVG() 计算结果集指定列数据的平均值 COUNT() 计算结果集行数 MIN() 找出结果集指定列数据的最小值 MAX() 找出结果集指定列数据的最大值 SUM() 计算结果集指定列数据的总和
-
-
算术函数
-
字符串函数
-
日期时间函数
-
数据类型转换函数
在SQL语言中,可使用内置函数对查询结果集进行分组数据统计。这是通过在SELECT语句中加入Group By子语句来实现。
SELECT 统计函数(目标列) FROM <表名> [WHERE 条件] GROUP BY <目标列> [Having 条件]; ''' 例1 若要分专业统计Student表中的学生人数。在SELECT语句中可以使用GROUP BY分组子句完成统计,其查询SQL语句如下: ''' SELECT Major AS 专业, COUNT(StudentID) AS 学生人数 FROM Student GROUP BY Major; ''' 例2 若要分专业统计STUDENT表中男生人数,但限定只显示人数大于2的人数,其查询SQL语句如下: ''' SELECT Major AS 专业, COUNT(StudentID) AS 学生人数 FROM Student WHERE StudentGender=’男’ GROUP BY Major HAVING COUNT(*)>2;
子查询与多表关联
在实际应用中,通常需要关联多表才能获得所需的信息。在SELECT查询语句中,可使用子查询方式实现多表关联查询。
子查询SQL语句基本格式: SELECT <目标列>[,<目标列>…] FROM <表名> WHERE <条件中嵌套另一关系表的SELECT 查询结果集> ''' 例 在选课管理系统数据库中,希望能检索出“计算机学院”的教师名单。 该操作需要关联教师信息表Teacher和学院信息表College,才能获得这些数据。这里可采用子查询方法实现两表关联查询,其查询SQL语句如下: ''' SELECT TeacherID, TeacherName, TeacherTitle FROM Teacher WHERE CollegeID IN (SELECT CollegeID FROM College WHERE CollegeName=’计算机学院’);
使用连接关联多表查询
''' 在使用多个表查询时,子查询只有在结果数据均来自一个表的情况下才有用。但如果需要从两个或多个表中获取结果数据,就不能使用子查询,而需要采用连接关联多表查询。 连接关联多表查询SQL语句基本格式: ''' SELECT <目标列>[,<目标列>…] FROM <表名1>,<表名2>,…, <表名n>, WHERE <关系表之间的连接关联条件> ''' 例 在选课管理系统数据库中,希望获得各个学院的教师信息列表,包括学院名称、教师编号、教师姓名、教师性别、职称等信息。要求按学院名称、教师编号分别排序输出,其查询SQL语句如下: ''' SELECT B.CollegeName AS 学院名称, A.TeacherID AS 编号, A.TeacherName AS 姓名, A.TeacherGender AS 性别, A. TeacherTitle AS 职称 FROM Teacher AS A,College AS B WHERE A.CollegeID=B.CollegeID ORDER BY B.CollegeName, A.TeacherID;
JOIN …ON连接查询语句
''' 在SQL语言中,实现多表连接关联查询还可以使用JOIN…ON关键词的语句格式。其中两表连接关联查询的JOIN…ON语句格式如下: ''' SELECT <目标列>[,<目标列>…] FROM <表名1> JOIN <表名2> ON <连接条件>; ''' 例 在选课管理系统数据库中,希望获得各个学院的教师信息,包括学院名称、教师编号、教师姓名、教师性别、职称等信息。要求按学院名称、教师编号分别排序输出,其查询SQL语句如下: ''' SELECT B.CollegeName AS 学院名称, A.TeacherID AS 编号, A.TeacherName AS 姓名, A.TeacherGender AS 性别, A. TeacherTitle AS 职称 FROM TEACHER AS A JOIN COLLEGE AS B ON A.CollegeID=B.CollegeID ORDER BY B.CollegeName, A.TeacherID;
外部连接
前节介绍的多表连接方式在SELECT查询语句称为内部连接。 在一些特殊情况下,如关联表中一些行的主键与外键不匹配,查询结果集就会丢失部分数据。
''' 例 在选课管理数据库中,希望查询所有开设课程的学生选课情况,包括课程名称、任课教师、选课学生人数。这需要关联课程信息表COURSE、教师信息表TEACHER、开课计划表PLAN、选课注册信息表REGISTER。其连接查询的SQL语句如下: ''' SELECT C.CourseName AS 课程名称, T.TeacherName AS 教师, COUNT (R.CoursePlanID) AS 选课人数 FROM COURSE AS C JOIN PLAN AS P ON C.CourseID=P.CourseID JOIN TEACHER AS T ON P.TeacherID=T.TeacherID JOIN REGISTER AS R ON P.CoursePlanID=R.CoursePlanID GROUP BY C.CourseName, T.TeacherName; ''' 问题:在上面的内连接查询中,只能找出有学生注册的课程名称和选课人数,但不能找出没有学生注册的课程名称。 在SQL 应用中,有时候也希望输出那些不满足连接条件的元组数据。这时,可使用JOIN…ON外连接方式实现。其实现方式有三种形式,具体如下: LEFT JOIN: 左外连接,即使没有与右表关联列值匹配,也从左表返回所有的行。 RIGHT JOIN: 右外连接,即使没有与左表关联列值匹配,也从右表返回所有的行。 FULL JOIN: 全外连接,同时进行左连接和右连接,就返回所有行。 例 在选课管理系统数据库中,希望能查询所有开设课程的学生选课情况,包括课程名称、任课教师、选课学生人数。这需要关联课程信息表COURSE、开课计划表CPLAN、教师信息表TEACHER、选课注册信息表REGISTER。若使用左外连接查询,该JOIN…ON连接查询的SQL语句如下: ''' SELECT C.CourseName AS 课程名称, T.TeacherName AS 教师, COUNT (R.CoursePlanID) AS 选课人数 FROM COURSE AS C JOIN PLAN AS P ON C.CourseID=P.CourseID JOIN TEACHER AS T ON P.TeacherID=T.TeacherID LEFT JOIN REGISTER AS R ON P.CoursePlanID=R.CoursePlanID GROUP BY C.CourseName, T.TeacherName;
第四章
数据库设计方案
包括
-
数据库应用架构设计
-
在不同应用需求场景中,数据库的应用架构方式是不同的。数据库应用架构可分为单用户结构、集中式结构、客户/服务器结构和分布式结构。
-
-
数据库结构模型设计
-
数据库结构模型设计一般分为概念层、逻辑层、物理层设计,它们的设计模型分别为概念数据模型、逻辑数据模型和物理数据模型。
-
-
数据库应用访问方式设计
-
数据库应用对数据库访问可以有多种方式,如直接本地接口连接访问、基于标准接口连接访问、基于数据访问层框架连接访问。
-
数据库结构模型
注意区分
概念数据模型(Concept Data Model,CDM)是一种面向用户的系统数据模型,它用来描述现实世界的系统概念化数据结构。使数据库设计人员在系统设计的初始阶段,摆脱计算机系统及DBMS的具体技术问题,集中精力分析业务数据以及数据之间的联系等,描述系统的数据对象及其组成关系。
逻辑数据模型 (Logic Data Model,LDM)是在概念数据模型基础上,从系统设计角度描述系统的数据对象组成及其关联结构,并考虑这些数据对象符合数据库对象的逻辑表示。
物理数据模型(Physical Data Model,PDM)是在逻辑数据模型基础上,针对具体DBMS所设计的数据模型。它用于描述系统数据模型在具体DBMS中的数据对象组织、存储方式、索引方式、访问路径等实现信息。
概念数据模型Conceptual Data Model (CDM) | 从用户角度所建模的系统数据对象及其关系,它帮助用户分析信息系统的数据结构关系。 |
---|---|
逻辑数据模型Logic Data Mode(LDM) | 从系统分析员角度所建模的系统数据对象逻辑结构关系,它帮助开发人员分析信息系统的逻辑数据结构。 |
物理数据模型Physical Data Model (PDM) | 从系统设计人员角度所建模的系统数据物理存储及结构关系,它针对设计者具体定义信息系统的数据库表结构。 |
数据库开发过程
概念数据模型Conceptual Data Model (CDM) 从用户角度所建模的系统数据对象及其关系,它帮助用户分析信息系统的数据结构关系。 逻辑数据模型Logic Data Mode(LDM) 从系统分析员角度所建模的系统数据对象逻辑结构关系,它帮助开发人员分析信息系统的逻辑数据结构。 物理数据模型Physical Data Model (PDM) 从系统设计人员角度所建模的系统数据物理存储及结构关系,它针对设计者具体定义信息系统的数据库表结构。
E-R模型方法
E-R模型是“实体-联系模型”(Entity-Relationship Model)的简称。它是一种描述现实世界概念数据模型、逻辑数据模型的有效方法。
在E-R模型中,基本元素包括实体、属性、标识符和联系。
实体(Entity)是指问题域中存在的人、事、物、地点等客观事物在逻辑层面的数据抽象。它用于描述事物的数据对象,如客户、交易、产品、订单等。
属性是指描述实体特征的数据项。每个实体都具有1个或多个属性。
标识符是指标识不同实体实例的属性。标识符可以是1个或多个属性。
标识符与主键的区别是标识符是一个逻辑概念,主键是物理概念。
联系(Relationship)是指实体之间的联系,如“学生”与“成绩”的联系、“孩子”与“父亲”、“母亲”的联系等。
联系中关联的实体数目称为联系度数。
实体-联系类型
二元实体联系类型:
-
1对1(1:1)
-
1对多(1:N)
-
多对多(M:N)
上述实体之间的联系反映了一个给定实体有多少实例与另一实体实例存在的数量对应关系。通常采用术语基数(Cardinality)来表示。
在实体之间除了需要反映了数量对应关系,有时还需要反映实体参与关系的必要性,即可选(optional)或强制(mandatory)。
根据理解,导师不一定有学生,但学生一定有导师,强制符号加在不被强制要求的实体侧
同上,课程必须有教师,故在不被强制要求的教师一侧加上强制符号
扩展建模
在E-R模型中,实体之间除了基本联系外,还存在继承联系。继承联系用于表示实体之间的相似性关系。
在实体继承联系中,一端是具有公共属性的实体,称为父实体;另一端是与父实体具有相似属性,同时也具有特殊性的一个或多个实体,称为子实体。
在继承联系中,还可以分为互斥性继承联系和非互斥性继承联系。
除了互斥和非互斥的分类外,继承联系还可以分为完整继承和非完整继承。如果父实体实例必须属于子实体中的某一个,则称为完整继承联系;否则是非完整继承联系。
强弱实体联系
在E-R模型中,按照实体之间的语义关系,可以将实体分为弱实体和强实体。弱实体是指那些对于另外实体有依赖关系的实体,即一个实体的存在必须以另一实体的存在为前提。而被依赖的实体称为强实体。
在E-R模型中,根据弱实体在语义上对强实体依赖程度的不同,弱实体又分为标识符(ID)依赖弱实体和非标识符(非ID)依赖弱实体两类。
如果弱实体的标识符中含有所依赖实体的标识符,则该弱实体称为标识符(ID)依赖弱实体。
在有依赖联系的弱实体中,并非所有弱实体都是标识符(ID)依赖弱实体,它们可以有自己的标识符,这样的弱实体即为非标识符(ID)依赖弱实体。
概念数据模型建模设计
概念数据模型设计是通过对现实世界中数据实体进行抽取、分类、聚集和概括等处理,建立反映系统业务数据组成结构的过程。
步骤
-
业务数据分析,抽取数据实体
-
定义实体属性及其标识
-
建立实体联系,构建局部E-R模型图
-
分类、聚集和概括各个部分E-R模型图
-
完善全局E-R模型图,建立系统业务数据组成结构
-
弱实体转换关系表
-
非ID依赖弱实体
-
-
ID依赖弱实体
-
-
-
实体联系转换参照完整性约束
-
1:1
-
-
-
实体继承联系转换参照完整性约束
在处理实体继承联系转换时,将父表中的主键放置到子表中,既做主键又做外键。
“1:N实体递归联系”的转换
转换方案:首先将递归实体转换为表,其属性转换为列,标识符转换为主键,同时还将标识符转换为外键,实现自己对自己的参照。
“M:N实体递归联系”的转换
转换方案:增加一个关联表,该表分别参照原实体对应的关系表,并对原关系表建立两个参照完整性约束。
数据库规范化设计
为什么需要规范化数据库设计??
-
减少数据库中的冗余数据,尽量使同一数据在数据库中仅保存一份,有效降低维护数据一致性的工作量。
-
设计合理的表间依赖关系和约束关系,便于实现数据完整性和一致性。
-
设计合理的数据库结构,便于系统对数据高效访问处理。
结论:不规范的关系表可能存在数据冗余,引出数据访问操作异常现象,难以使数据库保持数据的一致性。
函数依赖理论
-
函数依赖的数学定义
定义:设有一关系模式R(U), U 为关系R的属性集合,X和Y为属性U的子集。设t,s是关系R中的任意两个元组,如果t[X] = s[X],则t[Y] = s[Y]。那么称Y函数依赖于X,表示为X→Y。
函数依赖的左部称为决定因子,右部称为依赖函数。决定因子和依赖函数都是属性的集合。
说明: 函数依赖反映属性或属性组之间相互依存、互相制约的关系,即关系表中属性之间的依赖关系。
-
函数依赖的类型
-
完全函数依赖
-
部分函数依赖
-
属性传递依赖
-
多值函数依赖
定义1:设X、Y是某关系的不同属性集,如X→Y,且不存在X’属于X ,使X’→Y,则Y称完全函数依赖,否则称Y部分函数依赖。
例1 对于关系R(X, Y, N, O, P),其中(X,Y)为复合主键,若其它属性N,O,P都完整依赖于该复合主键,则称关系R为完全函数依赖。反之,其它属性N,O,P仅依赖于X,或仅依赖于Y,则称R为部分函数依赖。
定义2:设X、Y、Z是某关系的不同属性集,有X→Y, , Y→Z,若X→Z,称Z对X存在函数传递依赖。
例2 对于关系R(X, N, O, P),其中X为主键,若属性N依赖于X,而X不依赖于N,属性O依赖于N。则属性O函数传递依赖于X。
定义3:设U是关系模式R的属性集,X和Y是U的子集,Z=U-X-Y,xyz表示属性集XYZ的值。对于R的关系r,在r中存在元组(x, y1, z1)和(x, y2, z2)时,也存在元组(x, y1, z2)和(x, y2, z1),那么在模式R上存在多值函数依赖。
例3 对于教学关系R(课程, 教师, 课程参考书),一门课程可以有多个任课教师,也可以有多本参考书;每个任课教师可以任意选择他的参考书。该关系存在多值函数依赖。
关系规范化范式
关系规范化是把一个有访问异常的关系分解成结构良好的关系的过程,使得这些关系有最小的冗余或没有冗余。
规范化范式(Normal Form,NF)是指关系表符合特定规范化程度的模式。
1.第1范式(1NF)
如果关系表中的属性不可再细分,该关系满足第1范式。反之,该表就不是关系表。
2.第2范式(2NF)
如果关系满足第1范式,并消除了关系中的属性部分函数依赖,该关系满足第2范式。
例 有一个关系(A,B,N,O,P),其复合主键为(A,B),那么N,O,P这三个非键属性都不存在只依赖A或只依赖B情况,则该关系满足第2范式,反之,不满足第2范式。
3.第3范式(3NF)
如果关系满足第2范式,并切断了关系中的属性传递函数依赖,该关系满足第3范式。
例 若有一个关系(A,N,O,P),主键为(A),那么非键属性N,O或P都不能由单个的N,O或P或它们的组合所确定。该关系满足第3范式。
4.巴斯-科德范式(BCNF)
在关系中,所有函数依赖的决定因子都是候选键,该关系满足BCNF范式。
例 关系STUDENT(StudentNum, Name, Email)中,决定因子StudentNum也是候选键,该关系满足BCNF范式。
5.第4范式(4NF)
如果关系满足BCNF范式,并消除了多值函数依赖,该关系满足第4范式。
例:设学校中某一门课程由多个教师讲授,每个教师可有自己的参考书。用关系模式Teaching(Course,Teacher,Book)来表示课程、教师和参考书之间的关系。
该关系Teaching(Course,Teacher,Book),属于BCNF范式;但是存在多值函数依赖,即不满足4NF。
将原表进行分解处理,可分解为Teaching(TeachID,CourseID,TeacherID,BookID)、Course(CourseID,CourseName)、 Teacher(TeacherID,TeacherName)、Book(BookID,BookName)后,即可消除多值依赖,便可满足4NF范式。
6.关系规范化程度利弊
关系的规范化程度越高,关系数据库存储的冗余数据就越少,可消除的数据访问异常就越多。
不过关系的规范化程度越高,分解出来的关系表就越多,但实现数据查询访问时,需关联多表,其效率降低。
第一范式:属性不可细分
第二范式:消除了部分依赖
第三范式:消除了属性传递依赖
巴斯科德范式:所有函数依赖的因子都是候选键
例 “学生”关系的规范化处理
-
满足第一范式吗?
可再分,不满足第一范式
本关系不满足1范式,因为“联系方式”属性可以再细分“电话”、“电子邮件”等。
-
满足第二范式吗
分析:主键(学号,课程号) (学号)→系名 (学号)→住址 (学号)→电话 (学号)→电子邮件 存在部分依赖,不满足第2范式
-> 故拆分
-
满足第三范式吗
分析:在学生关系表中,(学号) →系名,(系名) →住址,故(学号) →住址。存在传递函数依赖,不满足第3范式。
-
问题:它满足BCNF范式吗?
BCNF范式: 在关系中,所有函数依赖决定因子是主键,则该关系满足BCNF范式。
-
问题:它满足第4范式吗?
分析:一个系的学生住址可能有多处,办公电话也有多个,故“系信息”关系存在多值依赖,不满足第4范式。
逆规范化处理
所谓逆规范化,就是适当降低规范化范式约束,不再要求一个关系表必须达到很高的规范化程度,而是允许适当的数据冗余性,以获取数据访问性能。
逆规范化处理的基本方法: (1)增加冗余列或派生列 (2)多个关系表合并为一个关系表
第五章
数据库管理
什么是数据库管理?
数据库管理(Database Management)是指为保证数据库系统的正常运行和服务质量必须进行的系统管理工作。
为什么需要数据库管理
-
数据库系统随规模增大,系统会变得异常复杂
-
多用户数据库应用带来数据库访问复杂性
-
数据安全和数据隐私对机构和用户都非常重要
-
数据库系统随数据量增加和使用时间增长其性能会降低系统遭遇意外事件,数据库损坏或数据丢失
数据库管理目标
-
保障数据库系统正常稳定运行
-
充分发挥数据库系统的软硬件处理能力
-
确保数据库系统安全和用户数据隐私性
-
有效管理数据库用户及其角色权限
-
解决数据库系统性能优化、系统故障与数据损坏等问题
-
最大程度地发挥数据库对其所属机构的作用
-
DBMS的功能
-
数据库定义
-
数据库运行管理
-
数据库组织与存储
-
数据库维护
-
数据库通信
-
事务管理
为什么需要事务管理
在数据库应用系统中,完成一个业务处理通常需要多个操作步骤才能完成处理。在每个操作步骤中,都可能遭遇失败,若没有一个处理机制,就可能造成操作数据混乱,从而破坏数据一致性。
事务的概念
在数据库中,事务(Transaction)是指由构成单个业务处理单元的一组数据库访问操作,要求它们要么都成功执行,要么都不执行。
在数据库系统中,事务是DBMS执行的最小任务单元。同时,事务也是DBMS最小的故障恢复任务单元和并发控制任务单元。其生命周期状态变迁如图所示。
-
事务是最小的DBMS执行任务单元
-
事务是最小的故障恢复任务单元
-
事务是最小的并发控制任务单元
事务特性
为了确保数据库共享访问的数据正确性,要求DBMS的事务管理机制维护事务的ACID特性。
事务ACID特性:
原子性(Atomicity):事务所有操作在数据库中要么全部执行,要么全部不执行。 一致性(Consistency):事务多次执行,其结果应一致。 隔离性(Isolation):事务与事务之间隔离,并发执行透明。 持续性(Durability ):事务完成后,数据改变必须是永久的。
事务并发执行
事务并发执行是指多个事务程序在数据库系统中同一时段运行。
事务并发执行原因:
-
改善系统的资源利用率
-
减少事务运行的平均等待时间
事务SQL程序
事务SQL程序:
BEGIN 或 START TRANSACTION ;事务开始语句 ROLLBACK ;事务回滚语句 COMMIT ;事务提交语句 SAVEPOINT ;事务保存点语句
事务SQL程序基本框架
''' 例 在选课管理数据库CurriculaDB中,使用事务程序实现对学院信息表College的数据插入,其事务SQL程序如下: ''' START TRANSACTION; INSERT INTO college( collegeID, collegename)VALUES ('004', '外语学院'); INSERT INTO college( collegeID, collegename)VALUES ('005', '数学学院'); INSERT INTO college( collegeID, collegename)VALUES ('006', '临床医学院'); COMMIT; ''' 在事务过程中禁止使用一下语句,会直接提交事务: 创建数据库 CREATE DATABASE 修改数据库 ALTER DATABASE 删除数据库 DROP DATABASE 恢复数据库 RESTORE DATABASE 加载数据库 LOAD DATABASE 备份日志文件 BACKUP LOG 恢复日志文件 RESTORE LOG 授权操作 GRANT 。。。 '''
DBMS默认事务方式
若用户没有显式地定义事务时,DBMS按默认事务方式处理,即每执行一个SQL语句将自动构成一个事务。若将多条SQL语句定义为一个事务时,才使用专门的事务SQL语句显式地定义事务。
并发控制
为什么需要并发控制?
当多个事务程序在DBMS系统中同时运行时,可能会出现对一些共享数据同时进行访问操作,如一些事务修改数据,另一些事务读取数据。这些并发的共享数据操作,如果在DBMS中没有一定的约束控制情况下,可能会带来数据不一致性或事务程序死锁问题。因此,在多个事务并发运行时,必须进行并发控制处理。
并发控制目的
-
支持并发事务处理,使更多用户并行操作,提高系统的并发访问能力。
-
保证一个事务工作不会对另一个事务工作产生不合理的影响。
并发控制需解决的问题
-
丢失更新数据
执行结果分析:剩余机票数A值为15,该数据有错,应为14。
错误分析:
T1、T2两个事务并发执行,它们均对数据库共享数据A进行了非锁定资源的读写操作。
当事务T1和T2均读入该共享数据A并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。
-
不可重复读取
不可重复读取是指一个事务对一个共享数据重复多次读取,但前后读取的数据不一致。
问题分析:
为什么出现不可重复读取?
事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时,得到与前一次不同的值。
同类问题:
(1)事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录消失了。也称为不可重复读取。 (2)事务T1按一定条件从数据库中读取某些数据记录后,事务T2在其中插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。称为幻象读取【幻读】。 即不可重复读就是事务过程中,数据被修改或删除;如果数据被插入,则是幻读
-
脏数据读取
脏数据读取是指一个事务读取了被取消持久化的共享数据。
问题分析:
事务T2并不知道C值被T1恢复,因此,事务T2读取了脏数据。
脏读就是事务读到的数据最后被回滚了,实际读到的是假数据
并发事务调度原理与策略
事务并发执行可能带来如下问题: 当多个事务并发存取共享数据时,由于不当的数据操作顺序,可能出现数据不一致性问题(“丢失更新数据”、“不可重复读”、“脏数据读”等问题)。
并发事务调度是什么?
-
并发事务调度就是控制多个事务的数据操作语句按照恰当的顺序访问共享数据,使这些事务执行之后,避免造成数据的不一致性,即解决“丢失更新数据”、“不可重复读”、“脏数据读”等问题。
事务调度原理
在DBMS中,事务管理器将并发执行事务的SQL数据操作请求提交给并发控制调度器。由并发控制调度器将各个事务的SQL数据操作请求按照一定顺序进行调度执行,并完成对数据库缓冲区的读写操作。
事务调度策略
例 银行客户A的账户当前余款为1000元,客户B的账户当前余款为1500元。现在有两个事务T1和T2,其中T1事务将从客户A转账200元到客户B,T2事务也将从客户A转账400元到客户B。
结论:在事务并发执行中,只有当事务中数据操作调度顺序的执行结果与事务串行执行结果一样时,该并发事务调度才能保证数据操作的正确性和一致性。符合这样效果的调度称为可串行化调度。
DBMS并发事务调度目标:使并发事务调度实现的处理结果与串行化调度处理结果一致。
数据库锁机制
为了解决多个事务并发对共享数据进行新增、更新、删除、查询带来的数据不一致性问题时,需要对共享数据进行加锁访问。
-
资源锁定访问
在DBMS中,通过加入锁表机制,来实现共享数据锁定访问,其加锁方式包含如下类型。
-
排它锁定(Lock-X)——锁定后,不允许其它事务对共享数据再加锁
-
共享锁定(Lock-S)——锁定后,只允许其它事务对共享数据添加读取锁
-
资源锁定粒度
-
数据库——粒度最大
-
表——粒度较大
-
页面——粒度中等
-
行——粒度小
-
资源锁定实施方式
-
隐式锁定——DBMS缺省执行
-
显式锁定——加锁命令显式执行
基于锁机制的并发控制协议
为了实现并发事务对共享数据访问的串行化调度执行,还必须约束它们对共享数据的操作访问必须是以互斥方式进行。这就需要用到基于数据库锁机制的并发控制协议。
锁操作的相容性
排它锁 | 共享锁 | 无锁 | |
---|---|---|---|
排它锁 | 否 | 否 | 是 |
共享锁 | 否 | 是 | 是 |
无锁 | 是 | 是 | 是 |
加锁协议
一级加锁协议:任何事务在修改共享数据对象之前,必须对该数据执行排它锁定指令,直到该事务处理完成,才进行解锁指令执行。
特点:使用一级加锁协议,可避免出现更新丢失问题。但不能解决“不可重复读取”、“脏读”等数据不一致问题。
例 某航班剩余机票数据A的当前值为100张。现有分别来自不同售票点的两个并发事务T1和T2,其中T1事务将售出1张机票,T2事务将售出2张机票。以下分别给出它们在不加锁和按一级加锁协议的并发事务调度执行情况,见下图所示。
二级加锁协议:在一级加锁协议基础上,针对并发事务的共享数据读操作,必须对该数据执行共享锁定指令,读完数据后即刻释放共享锁定。
特点:该加锁协议不但可以防止“丢失更新”的数据不一致性问题,还可防止出现脏读数据问题。但有可能会出现“不可重复读取”的数据不一致问题。
例 某航班剩余机票数据A的当前值为100张。现有分别来自不同售票点的两个并发事务T1和T2,其中T1事务将售出1张机票,T2事务进行机票空余数查询。以下分别给出它们在按一级加锁协议执行和按二级加锁协议的事务调度执行情况,见下图所示。
三级加锁协议:在一级加锁协议基础上,针对并发事务对共享数据进行读操作,必须对该数据执行共享锁定指令,直到该事务处理结束才释放共享锁定。
特点:该加锁协议不但可以防止“丢失更新”、“脏读”的数据不一致性问题,还可防止出现“不可重复读取”的数据一致性问题。
例 某航班剩余机票数据A的当前值为100张。现有分别来自不同售票点的两个并发事务T1和T2,其中T1事务将售出1张机票,T2事务进行机票空余数查询。以下分别给出它们在按二级加锁协议执行和按三级加锁协议的并发事务调度执行情况,见下图所示。
不同级别锁协议比较
加锁协议级别 | 排它锁 | 共享锁 | 不丢失更新 | 不脏读 | 可重复读 |
---|---|---|---|---|---|
一级 | 全程加锁 | 不加 | 是 | 否 | 否 |
二级 | 全程加锁 | 开始时加锁,读完数据释放锁定 | 是 | 是 | 否 |
三级 | 全程加锁 | 全程加锁 | 是 | 是 | 是 |
两阶段锁定协议
并发事务的正确调度准则: 一个给定的并发事务调度,当且仅当它是可串行化时,才能保证正确调度。
保证可串行化的一个协议是:二阶段锁定协议
二阶段锁定协议规定每个事务必须分两个阶段提出加锁和解锁申请:
-
增长阶段,事务只能获得锁,但不能释放锁。
-
缩减阶段,事务只能释放锁,但不能获得新锁。
判断下列事务是否可串行化调度?
结论:若并发事务执行的所有事务都遵从两阶段锁定协议,则这些事务的任何并发调度都是可串行化调度,即这些并发调度执行结果可以保证数据库一致性。
死锁问题解决
事务死锁
在基于锁机制的并发事务执行中,如果这些事务同时锁定两个以及以上资源时,可能会出现彼此都不能继续执行的状态,即事务死锁状态。
例 两个事务T1和T2,它们都需要加锁访问数据库表Table1和Table2,其事务程序见图6-20a所示。当这两个事务程序调度执行时,只要不是按可串行化调度执行,则它们在执行时会出现死锁状态,见图6-20b所示。
死锁出现的必要条件
-
互斥条件
-
请求和保持条件
-
不剥夺条件
-
环路等待条件
防范死锁的策略
-
允许事务一次发出当前所需全部资源的锁定,使用完成后,再释放给其它事务使用。
-
规定所有应用程序锁定资源的顺序必须完全相同。
解决死锁的办法
当发生死锁时,回滚其中的一个事务,并取消它对数据库所做的改动。
事务隔离级别
说明:事务隔离级别设置是在DBMS中执行SET TRANSACTION命令来实现或通过管理工具设置。事务隔离级别设置越高,出现数据不一致的可能性越小,但系统吞吐量也越小。
安全管理
数据库系统安全模型
身份验证:从应用系统层面确认登录用户是否是合法使用者
权限控制:从DBMS系统层面通过存取权限机制控制用户对数据的访问
系统防护:从操作系统层面提供的安全机制防范非法系统访问
加密存储:从数据存储层面通过加密算法对数据库中数据进行加密存储
例 在3.7.1节的工程项目管理系统中,假定系统用户有三类角色:员工、经理和系统管理员。它们对数据库各个表对象的拥有权限见下表所示。
表 | 员工 | 经理 | 系统管理员 |
---|---|---|---|
DEPARTMENT | 读取 | 读取、插入、修改、删除 | 赋予权限、修改结构 |
EMPLOYEE | 读取、插入、修改 | 读取、插入、修改、删除 | 赋予权限、修改结构 |
PROJECT | 读取 | 读取、插入、修改、删除 | 赋予权限、修改结构 |
ASSIGNMENT | 读取 | 读取、插入、修改、删除 | 赋予权限、修改结构 |
工程项目管理系统数据库存取权限控制安全模型设计
用户管理
用户要访问数据库,必须先在DBMS中创建其账号,并成为数据库的用户。此后,用户每次访问数据库,都需要在DBMS进行身份验证,只有合法用户才能进入系统,访问操作数据库对象。
用户管理——在数据库安全管理中,DBMS需要对每个用户进行管理,如用户创建、用户修改、用户删除管理等。
'''创建用户''' CREATE USER "userA" WITH LOGIN --登录权限 NOSUPERUSER --不是超级用户 NOCREATEDB --不能创建数据库 NOCREATEROLE --没有创建角色权限 INHHERIT --继承系统权限 NOREPLICATION --没有数据库复制权限 CONNECTION -1 --数据库连接数不受限 IN ROLE Xxx_Role --分配角色 PASSWORD '123456'; '''修改用户''' ALTER USER <用户名> [ [ WITH ] option [ ... ] ]; --修改用户的属性 --如 ALTER USER "userA" CONNECTION LIMIT 10 PASSWORD 'GREESS1223' ALTER USER <用户名> RENAME TO <新用户名>; --修改用户的名称 ALTER USER <用户名> SET <参数项> { TO | = } { value | DEFAULT }; --修改用户的参数值 ALTER USER <用户名> RESET <参数项>; --重置用户参数值 '''删除用户''' DROP USER userA;
权限管理
数据库权限管理是指DBA管理员或数据库对象拥有者对其所拥有对象进行权限控制设置。
权限管理基本操作:
-
授予权限
-
收回权限
-
拒绝权限
权限类别:
-
数据库系统权限
-
数据库对象访问操作权限
-
数据库对象定义操作权限
权限管理SQL语句
GRANT <权限名> ON <对象> TO {用户名}; REVOKE <权限名> ON <对象> TO {用户名}; DENY <权限名> ON <对象> TO {用户名}; ''' 例 在3.7.1节的工程项目管理系统中,DBA管理员赋予员工用户(userA)对部门表(Department)、员工表(Employee)、项目表(Project)和任务表(Assignment)的读取数据权限。 ''' GRANT SELECT ON Department TO userA; GRANT SELECT ON Employee TO userA; GRANT SELECT ON Project TO userA; GRANT SELECT ON Assignment TO userA;
角色管理
在DBMS中,为了方便对众多用户及其权限进行管理,通常将一组具有相同权限的用户定义为角色(Role)。
角色管理内容:
-
创建角色
-
修改角色
-
删除角色
角色管理实现方式:
-
执行SQL语句管理角色
-
通过GUI操作管理角色
角色管理SQL语句
CREATE ROLE <角色名> [ [ WITH ] option [ ... ] ]; --创建角色 ALTER ROLE <角色名> [ [ WITH ] option [ ... ] ]; --修改角色属性 ALTER ROLE <角色名> RENAME TO <新角色名>; --修改角色名称 ALTER ROLE <角色名> SET <参数项> { TO | = } { value | DEFAULT }; --修改角色参数值 ALTER ROLE <角色名> RESET <参数项>; --复位角色参数值 DROP ROLE <角色名>; --删除指定角色 ''' 例 在工程项目管理系统中,假定需要在ProjectDB数据库内创建经理角色Role_Manager。该角色具有登录权限(Login)和角色继承权限(Inherit)系统权限,但它不是超级用户(SuperUser),不具有创建数据库权限(CreateDB)、创建角色权限(CreateRole)、数据库复制权限(Replication),此外数据库连接数(Connection Limit)不受限。 ''' CREATE ROLE "Role_Manager" WITH LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1; '''角色权限授予''' GRANT SELECT,INSERT,UPDATE,DELETE ON Department TO "Role_Manager"; GRANT SELECT,INSERT,UPDATE,DELETE ON Employee TO "Role_Manager"; GRANT SELECT,INSERT,UPDATE,DELETE ON Project TO "Role_Manager"; GRANT SELECT,INSERT,UPDATE,DELETE ON Assignment TO "Role_Manager";
数据库备份与恢复
数据库备份——是指将数据库当前数据和状态进行副本复制,以便当数据库受到破坏或丢失数据时可以进行修复。
数据库恢复——是指数据库中数据丢失或被破坏时,从备份副本将数据库从错误状态恢复到某一正确状态。
备份方法:
-
完全数据库备份
-
差异数据库备份
-
事务日志备份
-
文件备份
备份方式:
-
冷备份
-
热备份
备份时机——当系统数据库重要数据被修改、日志被清理、用户数据库创建、用户数据库加载等事件出现时。
数据库备份实现
--实例操作: 备份SAMPLE数据库到一个G磁盘的根目录文件Sample.bak中。 BACKUP DATABASE SAMPLE TO DISK = 'G:\Sample.bak'; --实例操作: 从存储备份文件中恢复SAMPLE数据库。 RESTORE DATABASE SAMPLE FROM DISK = ‘G:\Sample.bak';
第六章
数据库编程
ODBC
-
开放式数据库互连(Open DataBase Connectivity)实现了应用程序对多种不同DBMS的数据库的访问,实现了数据库连接方式的变革
-
是一套基于SQL的,公共的,与数据库无关的API
-
使每个应用程序利用相同的源代码就可访问不同的数据库系统
-
存取多个数据库中的数据,从而使得应用程序与数据库管理系统之间在逻辑上独立,使应用程序与数据库无关性
ODBC应用程序接口:
-
是一种使用ODBC技术实现应用程序与数据库互连的标准接口。
ODBC驱动程序管理器:
-
用于管理系统中的各种驱动程序。
JDBC
-
Java数据库连接(Java DataBase Connectivity,一种用于执行SQL语句的Java API
-
由一组用Java编程语言编写的类和接口组成
-
使用JDBC访问数据库需要相应数据库的JDBC驱动程序
-
通过Class.forName("org.postgresql.Driver")来注册驱动
-
通过DriverManager.getConnectiont(url, userName, passWord)获取Connection实例
-
通过connection.createStatement()来获取Statement实例
-
通过statement.executeQuery(sql)或excuteUpdate(sql)等方法来执行SQL语句,获取ResultSet结果集
-
关闭相关资源statement, connection
Servlet工作流程
HTTP请求
解析请求
创建Servlet实例
调用init()方法
调用service()方法
输出响应信息
响应
调用destroy()方法
Mybatis
Mybatis优点: 1)支持自定义SQL、存储过程、及高级映射 2)实现自动对SQL的参数设置 3)实现自动对结果集进行解析和封装 4)通过XML或者注解进行配置和映射,大大减少代码量 5)数据源的连接信息通过配置文件进行配置
JSP
JSP全名为Java Server Pages,java服务器页面。JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在!
jsp只是servlet的一种特殊形式,每一个jsp页面就是一个servlet实例,通俗一点的话来说:jsp就是servlet,只不过servlet把一些业务功能剥离开来交给了或者是形成了jsp。在我们的项目编译的时候就是把jsp编译成了servlet。
JSP比Servlet更方便更简单的一个重要原因就是:内置了9个对象!内置对象有:out、session、response、request、config、page、application、pageContext、exception
SSM典型Java web开发架构
-
JSP/HTML页面发送请求
-
Controller层接收用户请求,进行响应的流程处理
-
Service层完成具体的业务逻辑
-
DAO层对数据库进行操作
-
数据库
存储过程函数
存储过程(Stored Procedure)是一种数据库的对象; 由一组能完成特定功能的SQL 语句集构成; 是把经常会被重复使用的SQL语句逻辑块封装起来,经编译后,存储在数据库服务器端; 当被再次调用时,而不需要再次编译; 当客户端连接到数据库时,用户通过指定存储过程的名字并给出参数,数据库就可以找到相应的存储过程予以调用。
PostgreSQL使用CREATE FUNCTION命令创建存储过程。(11版本后可以用CREATE PRECEDURE)
CREATE [ OR REPLACE ] FUNCTION/PROCEDURE name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] ) [ RETURNS retype | RETURNS TABLE ( column_name column_type [, ...] ) ] AS $$ //$$用于声明存储过程的实际代码的开始 DECLARE -- 声明段 BEGIN --函数体语句 END; $$ LANGUAGE lang_name; //$$ 表明代码的结束, LANGUAGE后面指明所用的编程语言 ''' (1)name:要创建的存储过程名; (2)OR REPLACE :覆盖同名的存储过程; (3)argmode:存储过程参数的模式可以为IN、OUT或INOUT,缺省值是IN。 (4)argname:形式参数的名字。 (5)RETURNS:返回值;RETURNS TABLE:返回二维表 ''' --统计学生表的记录数 CREATE OR REPLACE FUNCTION countRecords () RETURNS integer AS $count$ declare count integer; BEGIN SELECT count(*) into count FROM STUDENT; RETURN count; END; $count$ LANGUAGE plpgsql; --执行存储过程 select 存储过程名(参数); 或者: select * from 存储过程名(参数); 例如: select countRecords ( ); 或者:select * from countRecords ( ); --如果程序员需要存储过程调用其他存储过程 CREATE OR REPLACE FUNCTION testExec() returns integer AS $$ declare rec integer; BEGIN select into rec countRecords(); --如果不关心countRecords()的返回值,则可用 PERFORM countRecords() 代替; return rec; END; $$ LANGUAGE plpgsql; --删除存储过程 DROP FUNCTION [ IF EXISTS ] name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [ CASCADE | RESTRICT ] ''' 主要参数: (1)IF EXISTS:如果指定的存储过程不存在,那么发出提示信息。 (2)name :现存的存储过程名称。 (3)argmode:参数的模式:IN(缺省), OUT, INOUT, VARIADIC。请注意,实际并不注明OUT参数,因为判断存储过程的身份只需要输入参数。 (4)argname:参数的名字。请注意,实际上并不注明参数的名字,因为判断函数的身份只需要输入参数的数据类型。 (5)argtype:如果有的话,是存储过程参数的类型。 (6)CASCADE:级联删除依赖于存储过程的对象(如触发器)。 (7)RESTRICT:如果有任何依赖对象存在,则拒绝删除该函数;这个是缺省值。 ''' DROP FUNCTION IF EXISTS testExec() '''基本语法''' --声明局部变量 变量声明的语法如下: declare 变量名 变量类型; 如果声明变量为记录类型,变量声明格式为: variable_name RECORD; 注:RECORD不是真正的数据类型,只是一个占位符。 例如:declare count intger; rec RECORD ; --条件语句 --在PL/pgSQL中有以下三种形式的条件语句,与其他高级语言的条件语句意义相同。 1). IF-THEN IF boolean-expression THEN statements END IF; 2). IF-THEN-ELSE IF boolean-expression THEN statements ELSE 3). IF-THEN-ELSIF-ELSE IF boolean-expression THEN statements ELSIF boolean-expression THEN statements ELSIF boolean-expression THEN statements ELSE statements END IF; --循环语句 1). LOOP 语句 LOOP statements END LOOP [ label ]; 2). EXIT EXIT [ label ] [ WHEN expression ]; 例如: LOOP count=count+1; EXIT WHEN count >100; END LOOP; 3). CONTINUE CONTINUE [ label ] [ WHEN expression ]; 例如: LOOP count=count+1; EXIT WHEN count > 100; CONTINUE WHEN count < 50; count=count+1; END LOOP; 4). WHILE WHILE expression LOOP statements END LOOP ; 例如: WHILE amount_owed > 0 AND balance > 0 LOOP --do something END LOOP; 5). FOR FOR name IN [ REVERSE ] expression ... expression LOOP statements END LOOP; 例如: FOR i IN 1...10 LOOP RAISE NOTICE 'i IS %', i; END LOOP; FOR i IN REVERSE 10...1 LOOP --do something END LOOP; --遍历命令结果 FOR record_or_row IN query LOOP statements END LOOP ; FOR循环可以遍历命令的结果并操作相应的数据,例如: declare rec RECORD ; FOR rec IN SELECT sid , sname FROM student LOOP raise notice ‘%-,%-’,rec.sid, rec.sname; END LOOP;
1、 使用存储过程的优点 (1) 减少网络通信量 (2) 执行速度更快 (3) 更强的适应性 (4) 降低了业务实现与应用程序的耦合 (5) 降低了开发的复杂性 (6) 保护数据库元信息 (7) 增强了数据库的安全性
2、使用存储过程的缺点 (1) SQL本身是一种结构化查询语言,而存储过程本质上是过程化的程序;面对复杂的业务逻辑,过程化处理逻辑相对比较复杂;而SQL语言的优势是面向数据查询而非业务逻辑的处理。 (2) 如果存储过程的参数或返回数据发生变化,一般需要修改存储过程的代码,同时还需要更新主程序调用存储过程的代码。 (3) 开发调试复杂,由于缺乏支持存储过程的集成开发环境,存储过程的开发调试要比一般程序困难。 (4) 可移植性差
数据库触发器
触发器:
-
触发器是特殊类型的存储过程,主要由操作事件(INSERT、UPDATE、DELETE) 触发而被自动执行。
-
触发器可以实现比约束更复杂的数据完整性,经常用于加强数据的完整性约束和业务规则。
-
触发器本身是一个特殊的事务单位。
触发器的特点:
-
与表相关联:必须定义在表或视图上。
-
自动触发:由执行INSERT、DELETE、UPDATE操作时触发
-
不能直接调用,也不能传递或接受参数
-
是事务的一部分:触发器和触发语句作为可在触发器内回滚的单个事务。
按触发的语句分为: INSERT触发器、DELETE触发器、UPDATE触发器
触发器执行的次数可分: (1)语句级触发器:由关键字FOR EACH STATEMENT声明,在触发器作用的表上执行一条SQL语句时,该触发器只执行一次,即使是修改了零行数据的SQL,也会导致相应的触发器执行。如果都没有被指定,FOR EACH STATEMENT会是默认值。 (2)行级触发器:由关键字FOR EACH ROW标记的触发器,当触发器作用的表的数据发生变化时,每变化一行就会执行一次触发器。例如,假设学生成绩表有DELETE触发器,当在该表执行DELETE语句删除记录时,如果删除了20条记录,则将导致 DELETE触发器被执行20 次。
按触发的时间分为三类: (1)BEFORE触发器:在触发事件之前执行触发器。 (2)AFTER触发器:在触发事件之后执行触发器。 (3)INSTEAD OF触发器:当触发事件发生后,执行触发器中指定的函数,而不是执行产生触发事件的SQL 语句,从而替代产生触发事件的SQL操作。在表或视图上,对于INSERT、UPDATE 或 DELETE 三种触发事件,每种最多可以定义一个INSTEAD OF 触发器
触发器相关的特殊变量
(1)NEW 数据类型是RECORD。对于行级触发器,它存有INSERT或UPDATE操作产生的新的数据行。对于语句级触发器,它的值是NULL。 (2)OLD 数据类型是RECORD。对于行级触发器,它存有被UPDATE或DELETE操作修改或删除的旧的数据行。对于语句级触发器,它的值是NULL。 (3)TG_OP 数据类型是text;是值为INSERT、UPDATE、DELETE 的一个字符串,它说明触发器是为哪个操作引发。
创建触发器的基本语法
CREATE TRIGGER 触发器名 { BEFORE | AFTER | INSTEAD OF } ON 表名 [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE PROCEDURE 存储过程名 ( 参数列表 ) ''' (1)指明所定义的触发器名 (2) BEFORE | AFTER | INSTEAD OF 指明触发器被触发的时间 (3) ON 表名 指明触发器所依附的表 (4) FOR EACH { ROW | STATEMENT } 指明触发器被触发的次数 (5) EXECUTE PROCEDURE 存储过程名 ( 参数列表 ) 指明触发时所执行的存储过程 '''
创建触发器的基本步骤
-
(1)检查数据库中将要创建的触发器所依附的表或视图是否存在,如果不存在,必须首先创建该表或视图。
-
(2)创建触发器被触发时所要执行的触发器函数,该函数的类型必须是TRIGER型,是触发器的执行函数。但要注意,有些数据库不需要独立定义触发器函数,而是在创建触发器时,定义触发器的过程体。
-
(3)创建触发器,一般需要指明触发器依附的表,触发器被触发执行的时间,触发器是行级触发器还是语句级触发器,触发器执行需要满足的条件。
--创建触发器的示例 CREATE TABLE stu_score ( sid character(10) NOT NULL, cid character(10) NOT NULL, score numeric(5,1), CONSTRAINT stu_score_pkey PRIMARY KEY (sid, cid) ) -- 为了防止非法修改stu_score表的课程成绩,创建audit_score表记录stu_score表的成绩变化,其表结构如下: CREATE TABLE audit_score ( username character(20) , --用户名 sid character(10) , cid character(10) , updatetime text , --修改的时间 oldscore numeric(5,1), --修改前的成绩 newscore numeric(5,1) --修改后的成绩 ) --创建触发器函数 create or replace function score_audit() returns trigger as $score_audit$ begin if (TG_OP == 'DELETE') then insert into audit_score select user,old.sid,old.cid,now(),old.score; return old; elsif (TG_OP == 'UPDATE') then insert into audit_score select user,old.sid,old.cid,now(),old.score,new.score where old.sid = new.sid and old.cid = new.cid; return new; elsif (TG_OP == 'INSERT') then insert into audit_score select user,new.sid,new.cid,now(),null,new.score; return new; end if; return null; end; $score_audit$ language plpgsql; --创建触发器 CREATE TRIGGER score_audit_triger AFTER INSERT OR UPDATE OR DELETE ON stu_score FOR EACH ROW EXECUTE PROCEDURE score_audit(); ALTER TRIGGER name ON table_name RENAME TO new_name 主要参数说明: (1)name:需要修改的现有触发器的名称。 (2)table_name:该触发器作用的表的名字。 (3)new_name:现有触发器的新名字。 --例如:将上述定义的触发器改名为score_audit_trig ALTER TRIGGER score_audit_trigger ON stu_score RENAME TO score_audit_trig; DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ] 主要参数说明: (1)IF EXISTS:如果指定的触发器不存在,那么发出提示而不是抛出错误。 (2)name:要删除的触发器名。 (3)table_name:触发器定义所依附的表的名称。 (5)CASCADE:级联删除依赖此触发器的对象。 (6)RESTRICT:如果有依赖对象存在,那么拒绝删除。该参数缺省是拒绝删除。 例如:将上述触发器score_audit_trig删除,同时级联删除依赖触发器的对象。 DROP TRIGGER IF EXISTS score_audit_trig ON stu_score CASCADE;
游标
(1)游标(Cursor)是一种临时的数据库对象; (2)用来存放从数据库表中查询返回的数据记录; (3)提供了从结果集中提取并分别处理每一条记录的机制; (4)游标总是与一条SQL查询语句相关联; (5)游标包括:SQL语言的查询结果,指向特定记录的指针。
声明游标
(1)在存储过程中游标类型的变量。例如:游标变量 refcursor; refcursor是关键字; 此时,游标变量还没有绑定查询语句,因此不能访问游标变量。 (2) 使用游标专有的声明语法,如: 游标名 CURSOR [ ( arguments ) ] FOR query; 其中arguments为由逗号分隔的参数列表,用于打开游标时向游标传递参数,类似于存储过程或函数的形式参数;query是select数据查询语句,返回的值存储在游标变量中。
--声明游标:例如: (1)curStudent CURSOR FOR SELECT * FROM student; (2)curStudentOne CURSOR (key integer) IS SELECT * FROM student WHERE SID = key; --打开游标 (1)OPEN FOR: -- 其声明形式为: OPEN unbound_cursor FOR query; --打开未绑定的游标变量,其query查询语句是返回记录的SELECT语句。 例如: OPEN curVars1 FOR SELECT * FROM student WHERE SID = mykey; (2)OPEN FOR EXECUTE --其声明形式为: OPEN unbound_cursor FOR EXECUTE query-string; --打开未绑定的游标变量。EXECUTE将动态执行查询字符串。例如: OPEN curVars1 FOR EXECUTE 'SELECT * FROM ' || quote_ident($1); 注意:$1是指由存储过程传递的第1个参数。 (3)打开一个绑定的游标,其声明形式为: OPEN bound_cursor [ ( argument_values ) ]; --仅适用于绑定的游标变量,只有当该变量在声明时包含接收参数,才能以传递参数的形式打开该游标,参数将传入到游标声明的查询语句中,例如: OPEN curStudent; OPEN curStudentOne (‘20160230302001’); --使用游标 -- 其声明形式为: FETCH cursor INTO target; --FETCH命令从游标中读取下一行记录的数据到目标中,读取成功与否,可通过PL/SQL内置系统变量FOUND来判断。 例如: FETCH curVars1 INTO rowvar; --rowvar为行变量 FETCH curStudent INTO SID, Sname, sex; --请注意:游标的属性列必须与 目标列的数量一致,并且类型兼容。 --关闭游标 CLOSE cursorName; -- 当游标数据不再需要时,需要关闭游标,以释放其占有的系统资源,主要是释放游标数据所占用的内存资源,cursorName是游标名。 例如: CLOSE curStudent; --需要注意:当游标被关闭后,如果需要再次读取游标的数据,需要重新使用open打开游标,这时游标重新查询返回新的结果。
示例
create or replace function cursorDemo() returns boolean as $BODY$ declare unbound_refcursor refcursor; vsid varchar; vsname varchar; vsgender varchar; begin open unbound_refcursor for execute 'select sid,sname,sex from student'; loop fetch unbound_refcursor into vsid,vsname,vsgender; if found then raise notice '%,%,%',vsid,vsname,vsgender; else exit; end if; end loop; close unbound_refcursor; raise notice '取数据循环结束...'; return true; end; $BODY$ language plpgsql; select cursorDemo();
嵌入式SQL编程
嵌入式SQL与宿主语言
-
(1)SQL语言具有很强的查询处理能力,而逻辑表达的能力很弱,界面编程能力也很弱。
-
(2)如JAVA,C/C++等高级语言具有很强逻辑表达能力,能实现复杂的处理逻辑,同时具有较强的用户界面实现功能。
-
(3)为了使程序语言同时具有它的优点,在JAVA、C/C++等高级语言中嵌入SQL语句,称高级语言为宿主语言。
-
(4)由DBMS的预编译器扫描识别处理SQL语句,把SQL语句转换成主语言调用语句,以使主语言编译程序能识别它,最后由主语言的编译程序将整个源程序编译成目标码,然后连接(Link)处理生成装载模块。
嵌入式SQL的处理过程
(1)嵌入式SQL是一个语句级接口,通过程序访问的数据库模式必须在编写程序时已知,以便构造SQL语句。例如,程序员必须知道数据表名称、列名称及它的域。 (2)对于嵌入式SQL,RDBMS一般采用预编译方法处理,即由RDBMS的预处理程序对源程序进行扫描,识别出嵌入的SQL语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它们,然后由主语言的编译程序将纯的主语言编译成目标码。
嵌入式SQL与主语言之间的通信 (1)向主语言传递SQL语句的执行状态信息,使主语言能够根据此信息控制程序流程,主要用SQL通信区实现 (2)主语言向SQL语句提供参数,主要用主变量实现 (3)将SQL语句查询数据库的结果传回主语言处理,主要用主变量和游标实现
嵌入SQL的使用规定
(1)在程序中要区分SQL语句和宿主语言语句
在嵌入式SQL中,为了能够区分SQL语句与宿主语言语句,所有的SQL语句都必须加前缀标识“EXEC SQL”,并以“END_EXEC”作为语句的结束标志。嵌入式SQL语句的格式如: EXEC SQL <SQL语句> END_EXEC 结束标志在不同的宿主语言中可能是不同的,在C和PASCAL语言程序中规定结束标志为“;”,而不是“END_EXEC”。
(2)SQL的集合处理方式与宿主语言单记录处理方式之间的协调
由于SQL语句处理的是记录集合,而宿主语言语句一次只能处理一条记录,因此需要使用游标(Cursor)机制,把集合操作转换为单记录处理方式。与游标有关的SQL语句如下: 1)游标定义语句(DECLARE)。游标是与某一查询结果相联系的符号名,游标用SQL的DECLARE语句定义,其格式如下: EXEC SQL DECLARE <游标名> CURSOR FOR < SELECT 语句> END EXEC 游标定义语句是一个说明语句,定义中的SELECT并不立即执行。
2)游标打开语句(OPEN)。该语句在执行游标定义中的SELECT语句,同时游标处于活动状态。游标是一个指针,此时指向查询结果的第一行之前。OPEN语句的格式如下: EXEC SQL OPEN <游标名>
END_EXEC
3)游标读取数据语句(FETCH)。此时游标推进一行,并把游标指向的行(即当前行)中的值取出并送到共享变量,其格式如下: EXEC SQL FETCH FROM <游标名> INTO <变量表>
END_EXEC 变量表由逗号分开的共享变量组成。FETCH语句通常置于宿主语言程序的循环结构中,并借助宿主语言的处理语句逐一处理查询结果中的每一个元组。
第七章 NoSQL
数据库管理目标与内容
-
数据类型多样化
-
数据结构多样化:需要结构化、半结构化、非结构化等各种结构
-
数据存储方式多样化:列式存储、键值存储、图存储、文档存储
-
存储位置-分布透明,存储量-海量
-
查询要求多层次:时空、关联、分析、挖掘等
-
操作需求多样化:各种数据统计分析、分类、聚类、预测、离群点发现等多种操作或自定义操作
关系型数据库的挑战
-
数据库高并发读写需求
-
数据的高效存储和处理
-
数据库高扩展性和高可用性需求
-
大数据处理方面的要求
1、数据库事务一致性需求很多web实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担; 2、数据库的写实时性和读实时性需求对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多web应用来说,并不要求这么高的实时性。
3、对复杂的SQL查询,特别是多表关联查询的需求。任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站,从需求以及产品设计角度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
分布式大数据处理
-
分布式文件系统
-
分布式文件系统(Distributed File System:DFS )是指文件系统的物理存储资源不在本地节点上,通过计算机网络与节点相连。
-
DFS为文件系统提供单个访问点和一个逻辑树结构,用户可透明访问系统中的任何文件
-
DFS将统一网络中的不同计算机上的共享文件夹组织起来,形成一个单独的、逻辑的、层次式的共享文件系统。
-
-
分布式数据库
-
分布式数据库=数据库 + 网络技术
-
思想:将数据分散存储,海量数据逻辑分片,存储容量大,并发访问量高
-
-
大数据
-
大数据就是海量数据+复杂计算。 5V特征: 超量Volume 高速Velocity 异构Variety 真实Veracity 价值Value
-
大数据处理挑战
-
数据的异构性和不完备性
-
数据处理的时效性
-
数据的安全与隐私保护
-
大数据的能耗问题
-
大数据管理易用性问题
-
-
-
分布式大数据
NoSQL特点
-
面对海量大数据的存储和管理, 需要对关系数据库进行补充
-
数据模型简单--增强可扩展性,避免复杂对象操作
-
元数据和应用数据分离: 高水平扩展和低端硬件集群
-
弱一致性--减少副本同步开销
CAP理论
-
分布式事务
-
-
分布式数据库系统中的事务是一个分布式操作序列,被操作的数据分布在不同的结点上。
-
分布式事务ACID特征,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
-
网络、服务器、软件故障----不一致??
-
-
分布式数据库的不一致--原因
-
在分布式DBMS环境中,事务在下列情况会导致不一致性: 1) 数据项的多个副本---如何保证多个副本的数据一致性? 2) 单点网络故障---如何通知所有的节点?事务是否继续? 3) 通信网络的故障---数据通讯? 4)分布式提交等-- 两阶段 、 三阶段提交过程中的问题?
-
分布式环境的3个核心需求
-
在分布式的环境下设计和部署系统时,有3个核心的需求:CAP对应一致性(Consistency),可用性(Availability)和分区容忍性(Partition Tolerance) Consistency Availability Partition Tolerance
-
CAP理论的核心
-
4 CAP理论的核心: 一个分布式系统不可能同时很好的满足一致性、可用性和分区容错性这三个需求,最多只能同时较好的满足两个。 CA - 单点集群,满足一致性,可用性的系统, CP - 满足一致性,分区容忍性的系统, AP - 满足可用性,分区容忍性的系统,
CAP目的:
-
CAP是为了探索不同应用的一致性C与可用性A之间的平衡,
-
在网络或其他原因,通过牺牲一定的一致性C来获得更好的性能与扩展性
-
在有分隔发生,选择可用性A,集中关注分隔的恢复,需要分隔前、中、后期的处理策略, 及合适的补偿处理机制。
-
选择什么样的方式: 放弃P?放弃A?放弃C?BASE
BASE
-
Basically Available --基本可用;系统能够基本运行,一直提供服务。
-
Soft-state --软状态/柔性事务。"Soft state" 可以理解为"无连接"的, 而 "Hard state" 是"面向连接"的;系统不要求一直保持强一致状态。
-
Eventual Consistency --最终一致性 系统在某个时刻达到最终一致性。
-
BASE定义为CAP中AP的衍生,在分布式环境下, BASE是数据的属性,BASE强调基本的可用性,按照功能划分数据库.
BASE特点
-
ACID是事务的特征, A(原子性)C(一致性)I(隔离性)D(持久性),ACID的特点是强一致性、隔离性、采用悲观保守方法、难以变化;
-
BASE的特点是弱一致性、可用性优先、采用乐观方法、适应变化并且简单快捷。
-
对数据不断增长的系统, 大数据环境下系统的可用性及分隔容忍性的要求要高于强一致性,很难满足事务要求的ACID特性。
最终一致性理论
-
强一致性: 要求无论更新操作实在哪一个副本执行,之后所有的读操作都要能获得最新的数据。
-
弱一致性:用户读到某一操作对系统特定数据的更新需要一段时间,称这段时间为“不一致性窗口”。
-
最终一致性: 弱一致性的一种特例,保证用户最终能够读取到某操作对系统特定数据的更新。
评价最终一致性的两个角度
一致性可以从客户端和服务器端两个角度来看
客户端关注的是多并发访问的更新过的数据如何获取的问题,对多进程并发进行访问时, 更新的数据在不同进程如何获得不同策略,决定了不同的一致性。
服务器关注的是更新如何复制分布到整个系统, 以保证最终的一致性。 一致性因为有并发读写才出现问题, 一定要结合并发读写的场地应用要求。 如何要求一段时间后能够访问更新后的数据, 即为最终一致性。
最终一致性—模型
1)因果一致性: 无因果关系的数据的读写不保证一致性。 2)读一致性: 用户自己总能够读到更新后的数据。 3)会话一致性: 把读取存储系统的进程限制在一个会话范围内。 4)单调读一致性:后续的操作都不会返回到给数据之前的值。 5)单调写一致性: 来自同一个进程的更新操作按照时间顺序执行, 也叫时间轴一致性。
NOSQL的理论基础
-
CAP理论
-
BASE理论
-
最终一致性理论
NoSQL
NoSQL的优缺点
-
优点表现在: 高可扩展性、分布式计算、低成本、 架构的灵活性,半结构化数据、 没有复杂的关系。
-
缺点: 没有标准化、有限的查询功能(到目前为止)、最终一致不直观等
NoSQL的共同特征如下:
-
不用预定义模式
-
没有共享的架构
-
弹性可扩展
-
分区
-
异步复制
-
BASE
NoSQL的整体框架
NoSQL数据库的存储模型
-
列存储数据库,将同一列的数据存储在一起,可以存储结构化和半结构化数据
-
键值存储数据库,存储的数据是有键(key)和值(value)两部分组成,通过key快速查询到其value,value的格式可以根据具体应用来确定
-
文档存储数据库,存储的内容是文档型的,可以用格式化文件(类似json、XML等)的格式存储
-
图存储数据库,数据以有向加权图方式进行存储
四大分类比较
分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值 (key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | 与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容 | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案 |
NoSQL数据库的应用场景
1、数据模型比较简单; 2、需要灵活性更强的IT系统; 3、对数据库性能要求较高; 4、不需要高度的数据一致性; 5、对于给定key,比较容易映射复杂值的环境。
许多云环境下的新型应用,如社交网络网、移动服务、协作编辑等 。云计算时代海量数据管理系统的设计目标为可扩展性、弹性、容错性、自管理性和“强一致性”。---NewSQL
列存储数据库
HBase
将数据库中的一列数据串在一起存储起来,然后再存储下一列数据,以此类推,查询中的选择规则是通过列来定义的,类存储数据库是自动索引化的;数据压缩比高,查询数据高
HBase:Hadoop Database构建在Apache Hadoop上的列式数据库,开源的非关系型分布式数据库,通过Java实现的列存储方式的NoSQL数据库
键值对数据库
Redis
Key-Value(键值)存储模型是NoSQL中最基本的数据存储模型,KV类似于哈希表,在键和值之间建立映射关系,键值模型极大的简化了关系数据模型,具有高效灵活的特点键值对数据库一致性表现在针对单个键的操作包括“获取”、“设置”、或者“删除”,保证“一致性”,也可以用“最终一致性模型”实现一致性
文档数据库
MongoDB
文档是处理信息的基本单位。文档可以很长、很复杂、可以无结构一个文档对包含的数据类型和内容进行“自我描述”。XML文档、HTML文档和JSON文档嵌入式文档 --文档存储模型支持嵌套结构每个文档的ID就是它唯一的键,ID在一个数据库“集合”中是唯一的, 检索排序的ID性能好
图形数据库
Neo4J
互联网+、社交网络,智能推荐等的大规模兴起和繁荣。寻找直接朋友或是寻找朋友的朋友这样的遍历查询----图数据库\图数据库源起欧拉和图理论,面向/基于图的数据库
以“图”数据结构存储和查询数据,数据模型以节点和关系(边)体现,也处理键值对
图特征:包含节点和边;节点上有属性(键值对);边有名字和方向,开始\结束节点;边可有属性。图是顶点和边的集合,或图是一些节点和关联联系(relationship)的集合