前言:高级数据库的课程笔记,按提纲整理,部分内容没有整入。
其他数据库:XMLDB OODB ORBD
XML数据库
特点
- 半结构化的存储格式带有数据自描述的特性,更加灵活,兼容html等半结构化数据
- 与传统数据库并不冲突,是关系模型的一种拓展
- XML的核心在于对数据内容进行描述,使得系统能够根据标记对数据进行有效管理而不用改动表结构,因此产生了相应XML数据库技术。
SQL/XML
- 基于关系模型
- 允许在SQL查询中直接使用XML发布函数生成XML结构
- 对传统的SQL做了扩展
- SQL/XML既提供了从关系数据创建XML的功能,又能很好的适应已有的SQL环境
面向对象
对象数据库优点:
OODBS赋予数据库设计和应用开发人员很强的面向对象能力,从而大大扩展了数据库系统的应用领域,提高了开发人员的工作效率和应用系统的质量。面向对象数据模型与传统数据模型相比"在以下方面具有优势 :
- 1、易维护,采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
- 2、质量高,在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
- 3、效率高,在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
- 4、易扩展,由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
内容 | 关系数据模型 | 面向对象数据模型 |
---|---|---|
基本数据结构 | 二维表 | 类 |
数据标识符 | 码 | OID |
静态性质 | 属性 | 属性 |
动态行为 | 关系操作 | 方法 |
抽象数据类型 | 无 | 有 |
封装性 | 无 | 有 |
数据间关系 | 主外码联系,数据依赖 | 继承、组合 |
模式演化能力 | 弱 | 强 |
❖OO模型的基本概念
▪ 对象
▪ 对象标识OID
▪ 封装
▪ 类
❖对象关系数据库系统中扩展的关系数据类型
▪ 大对象LOB
▪ BOOLEAN类型
▪ 集合类型ARRAY
▪ DISTINCT类型
❖对象关系数据库系统中扩展的对象类型
▪ 行对象与行类型
▪ 列对象与对象类型
▪ 抽象数据类型
❖关系对象数据库系统支持
▪ 继承
▪ 子表和超表
对象关系数据库系统中扩展的关系数据类型
❖扩展的类型:LOB、BOOLEAN、集合类型ARRAY、用户定义的DISTINCT类型等
❖面向对象的数据类型:行类型ROW TYPE、抽象数据类型(Abstract Data Type)
LOB
大对象LOB(Large OBject )类型
❖ LOB可存储多达十亿字节的串。
❖ LOB分类
▪ 二进制大对象BLOB(Binary Large OBject)
➢ BLOB用于存储音频、图像数据
▪ 字符串大对象CLOB(Character Large OBject)。
➢ CLOB用于存储长字符串数据
boolean
❖ 布尔类型,支持3个真值: true、 false和unknown
❖ 操作符: NOT、 AND、 OR、 EVERY、 ANY
例如 WHERE EVERY(QTY>200)
或WHERE ANY(QTY>200)
▪ QTY列为空值:返回unknown;
▪ QTY列为非空:
➢当该列的每一个值都使(QTY>200)为true时, EVERY返回true,
否则为false;
➢当该列的每一个值都使(QTY>200)为false时, ANY返回false,
否则为true。
集合类型array
❖ 相同类型元素的有序集合称为数组ARRAY
▪ SQL3新增的集合类型
▪ 允许在数据库的一列中存储数组
❖ SQL3的数组只能是一维的
▪ 数组中的元素不能再是数组
例:
-
创建表
CREATE TABLE SALES(
ITEM_NO CHAR(20), /商品号/
QTY INTEGER ARRAY[12] , /整数数组,存放销售额/
PRIMARY KEY(ITEM_NO) ); -
向SALES表插入一个元组:
INSERT INTO SALES(ITEM_NO, QTY)VALUES
(‘T-shirt2000’, ARRAY[200, 150, 200, 100, 50, 70,
80, 200, 10, 20, 100, 200] ); -
查找三月份销售额大于100的商品号:
SELECT ITEM_NO
FROM SALES
WHERE QTY[3] >100;
自定义类型distinct
❖ SQL3新加了一种DISTINCT类型
❖ 定义DISTINCT数据类型语法
CREAT TYPE <type name>
AS <built in scalar type name> FINAL
[<cast option>]
[ <method specification commalist>];
例:
- 没有使用DISTINCT类型
▪ 例如,职工的智商字段(IQ)和鞋号字段(SHOE_SIZE)
定义成INTEGER类型
▪ WHERE SHOE_SIZE > IQ - 使用DISTINCT类型
▪ 重新定义这两字段类型
➢CREAT TYPE SHOE_SIZE_TYPE AS INTEGER FINAL;
➢CREAT TYPE IQ_TYPE AS INTEGER FINAL;
▪ SHOE_SIZE_TYPE和IQ _TYPE成为两种不同的数据类型
表达式: WHERE SHOE_SIZE > IQ 是非法的
▪ 如果在定义类型时设置了选项<cast option>,下面用法也是合法
的: WHERE MY_SHOE_SIZE > CAST (MY_IQ AS SHOE_SIZE)
面向对象数据类型
❖ 在ORDBMS中, 类型(TYPE)具有类(CLASS)的
特征,可以看成类
行对象与行类型 ROW TYPE
在ORDBMS中, 类型(TYPE)具有类(CLASS)的特征,可以看成类 。
◼ 定义行类型(ROW TYPE) :
CREATE ROW TYPE <row_type_name>
(<component declarations>);
◼ 创建行类型
[例3]
CREATE ROW TYPE Person_type
(pno NUMBER,
name VARCHAR2(100),
address VARCHAR2(100) );
◼ 创建基于行类型的表
CREATE TABLE <table_name> OF <row_type_name>;
[例4]
CREATE TABLE person_extent OF Person_type
(pno PRIMARY KEY );
列对象与对象类型 COLUMN TYPE
◼ 可以创建一个对象类型,表的属性可以是该对象类型。
◼ 创建列对象语句如下:
CREATE TYPE <type_name> AS OBJECT
(<component declarations>);
[例5]
CREATE TYPE address_objtyp AS OBJECT
(street VARCHAR2(50), city VARCHAR2(50) );CREATE TYPE name_objtyp AS OBJECT
(first_name VARCHAR2(30),last_name VARCHAR2(30) ) ;
◼ 创建表,定义其中的属性是对象类型
[例6]
CREATE TABLE people_reltab (
Id NUMBER(10),
name_obj name_objtyp,
address_obj address_objtyp);
抽象数据类型Abastract Data Type)
❖ 概念: SQL3允许用户创建指定的带有自身行为说明和内
部结构的用户定义类型称为抽象数据类型
❖ 定义ADT的一般形式为
CREATE TYPE <type_name> (
所有属性名及其类型说明,
[定义该类型的等于=和小于<函数, ]
定义该类型其他函数(方法));
NOTE:
▪ (1) ADT的属性定义和行类型的属性定义类同。
▪ (2) 在创建ADT的语句中,通过用户定义的函数比较对象的值。
▪ (3) ADT的行为通过方法(methods)、函数(functions)实现。
▪ (4) SQL3要求抽象数据类型是封装的,而行类型则不要求封装。
▪ (5) ADT有3个通用的系统内置函数
▪ (6) ADT可以参与类型继承
参照类型(Reference Type)
❖REF类型(参照类型、引用类型)
▪ 引入的原因:
类型之间可能具有相互参照的联系
▪ 形式
REF <类型名>
▪ 特点:
➢REF类型总是和某个特定的类型相联系。
➢它的值是OID
❖创建两个表: Employee和Company,两表之间存在相互参照关系,即某个职工在某个公司工作
▪ (1)创建行类型
[例7]
CREATE ROW TYPE employee_type(
name VARCHAR(35),
age INTEGER );
CREATE ROW TYPE Comp_ type(
compname VARCHAR(20),
location VARCHAR(20) );
▪ (2)创建基于行类型的表:
CREATE TABLE Employee OF employee_type;
CREATE TABLE Company OF Comp_ type
▪ (3)描述参照关系
CREATE ROW TYPE Employment type (
employee REF (employee_type),
company REF (Comp type) );CREATE TABLE Employment OF Employment _type
➢表Employment中某一个元组的employee属性值是某个职工的OID
➢company属性值是该职工所在公司的OID
[例8]
CREATE ROW TYPE employee_type(
name VARCHAR(35),
age INTEGER,
emp_id REF(employee_type) );
[例9]
CREATE TABLE Employee OF employee_type
VALUES FOR emp_id ARE SYSTEM GENERATED;
❖ 建立参照属性:
<参照属性名>[REF(<类型名>)] SCOPE IS <关系名>
[例10]
CREATE TABLE address_objtab OF address_objtyp ;
[例11]
CREATE TABLE people_reltab2 (
id NUMBER(4) PRIMARY KEY,
name_obj name_objtyp,
addresss_ref REF(address_objtyp) SCOPE IS address_objtab )
[例12]
CREATE INDEX address_ref_idx ON
people_reltab2(address_ref) ;
[例13]
SELECT id
FROM people_reltab2 p
WHERE p.address_ref.city=‘北京’ and p.address_ref.street=‘牛街’;
继承性
❖ ORDBMS应该支持继承性
▪ 一般是单继承性
❖ [例14]
CREATE TYPE emp_type
UNDER person_type AS(
emp_id INTEGER,
salary REAL )
NOT FINAL;
◼ NOT FINAL:表示不是类层次结构中最后的“叶结点”
◼ FINAL:该类型是类层次结构的叶结点
子表和超表
❖ 超表、子表、子表的子表构成一个表层次结构
❖ 表层次和类型层次的概念十分相似
[例15] 对于下面的类型层次,先定义这些类型TYPE,然后创建基于这些类型的表
CREATE TYPE person /创建person 类型,根类型/
(id INTEGER,
name VARCHAR(20),
birthyear INTEGER,
address VARCHAR(40))
NOT FINAL; /NOT FINAL表示可以有子类型/CREATE TYPE employee /创建person的子类型employee/
UNDER person /类型employee继承person的属性/
(salary INTEGER) /* employee定义自己的属性*/
NOT FINAL;CREATE TYPE executive /创建employee的子类型executive/
UNDER employee
(bonus INTEGER)
FINAL;CREATE TYPE student /*创建person的子类型student */
UNDER person
(major VARCHAR(10), wage DECIMAL)
FINAL
[例16] Department类型和employee具有相互参照的联系,使用REF来表示这种联系
CREATE TYPE department
(ID INTEGER,
manager REF(employee),
Budget INTEGER);
ALTER TYPE employee
ADD ATTRIBUTE dept REF(department);
❖ 定义基于这些类型的基本表和表层次:
◼ CREATE TABLE person_table OF person
(name WITH OPTIONS NOT NULL);◼CREATE TABLE exec_table of executive
UNDER employee_table◼CREATE TABLE employee_table OF employee
UNDER person_table;CREATE TABLE student_table OF student
UNDER person_table;CREATE TABLE dept_table OF department
(manager SCOPE IS employee_table);ALTER TABLE employee_table
ALTER COLUMN dept ADD SCOPE IS dept_table;
❖查询[例1