面向对象数据库
一、面向对象数据模型
1、OO模型的核心概念
对象Object
a) 属性
属性描述对象的状态、组成和特性。对象的某一属性可以是单值的货值的集合,也可以是一个对象,即对象的嵌套。
b) 方法
方法描述了对象的行为特性。方法的定义包括两部分,一是方法的接口,二是方法的实现。
对象标识符Object IDentifer
面向对象数据库中的每个对象都有一个唯一的不变的标识称为对象标识(OID)。对象标识具有永久持久性,即一个对象一经产生就会赋予一个在全系统中唯一的对象标识符,知道它被删除。OID是有系统统一分配的,唯一的,用户不能对OID进行修改。因此,OID与关系数据库中码KEY的概念和某些关系系统中支持的记录标识RID、元组(表的行)标识TID是有本质区别的。OID是独立于值、系统全局唯一的。
封装Encapsulation
每一个对象是具有其状态与行为的封装,其中状态是该对象一系列属性值的集合,而行为是在对象状态上操作的集合,操作也称为方法。
OO模型的一个关键概念就是封装。每一个对象是其状态和行为的封装。
封装是对象的外部界面与内部实现之间实行清晰隔离的一种抽象,外部与对象的通讯只能通过消息,这个就是OO模型的主要特征之一
但是,对象封装之后查询属性值必须通过调用方法,不能想关系数据库那样(SQL)进行随机、按内容的查询,这就不够方便灵活,失去了关系数据库的重要优势,因此OODB中必须在对象封装方面作必要的修改或者妥协。
类Class
共享同样属性和方法集的所有对象构成了一个对象类(简称类),一个对象就是某一个类的实例instance。面向对象数据库模式是累的集合。
2、类层次(结构)
面向对象的数据模型提供了一种类层次结构。
超类是子类的抽象Generalization或概括,子类是超类的特殊化Specialization或者具体化。
3、继承
在OO模型中常用的有两种继承,单继承和多重继承。
单继承的层次结构图是一颗树,多继承的层次结构是一个带跟的有向无回路图。
继承优点
第一, 它是建模的有力工具,提供了对现实世界简明而精确的描述。
第二, 它提供了信息重用机制。
由封装和继承还导出面向对象的其他优良特性,如多态性、动态联编等。
4、对象的嵌套
一个对象的属性可以是一个对象,这样对象之间产生一个嵌套层次结构。对象嵌套概念是面向对象数据库系统中又一个重要概念。
二、对象—关系数据库
ORDBS是关系数据库系统与面向对象数据库模型的结合。它保持了关系数据库系统的非过程化数据存取方式和数据动力性,继承了关系数据库系统已有的技术,支持原有的数据管理,又能支持OO模型和对象管理。
1、对象关系数据库系统中扩展的关系数据类型
大对象LOB(Large Object)类型
LOB可以存储多达十亿字节的串。LOB又分为二进制大对象BLOB(Binary Large Object)和字符串大对象CLOB(Character Large Object)两种。BLOB用于存储音频、图像数据。CLOB用于存储长字符串数据。
LOB类型数据是直接存储在数据库中,由DBMS维护,不是存在外部文件中。LOB类型可以像其他数据类型的数据一样被查询、提取、插入和修改。
应用程序在操作LOB类型数据库时用LOB定位器(LOB locater)来提取LOB数据。应用程序通常并不传输整个LOB类型的值,而是通过LOB定位器访问大对象值。
BOOLEAN类型
BOOLEAN是布尔类型,它支持3个真值:true、false和unknown。除了传统的NOT、AND和OR布尔操作外SQL3还支持了两个新的操作:EVERY(而不是ALL)和ANY。这两个操作的参数都是BOOLEAN类型,该BOOLEAN值通常由一个表达式得到。
集合类型(Collection Type)ARRAY
相同类型元素的有序集合称为数组ARRAY,这是SQL3新增的集合类型,它允许在数据库的一行中存储数组。SQL3中数据只能值一维的,而且数组中的元素不能再是数组。
例子
Create Table sales
(
ItemNO char (20),
QTY integer AARAY [12],
Primay key (ItemNO)
);
下面是向sales表插入一个元组:
Insert into sales(ItemNO,QTY)values
(‘aaa’,ARRAY[200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200]);
查询语句
Select ItemNO
From sales
Where QTY[3]>100; //从QTY数组中第三个值大于100的
DISTINCT类型
SQL3新增了一种DISTINCT类型。
在应用中,不同字段经常定义成同一种数据类型。例如职工的IQ和鞋子shoeSize字段都定义成了integer类型。表达式where shoeSize>IQ语法是对的,因为它们是同种类型,但是这个显然不符合实际应用的语义。
这时可以叫IQ和鞋子字段定义成distinct字段。
例子
Create type shoeSize-type as integer final;
Create type IQ-type as integer final;
这样where shoeSize>IQ就是非法的了。
2、对象关系数据库系统中扩展的对象类型及其定义
在ORDBMS中,类型TYPE具有类(CLASS)的特征,可以看成类。
行对象与行类型
例子
Create ROW TYPE person-type
(
Pno NUMBER,
Name VARCHAR2(100),
Adress VARCHAR2(200)
);
现在创建一个行类型person-type
Create table person_extent OF person-type
(Pno primay key);
创建了一个表person_extent,它由行类型person-type来定义。表的属性直接对应行类型的属性定义。表中每行是一个对象,有OID标识符。
列对象和对象类型
在实际ORDBMS中(oracle)提供了列对象的概念,可以创建一个对象类型,表的属性尅是该对象类型。
例子
Create Type address_objtype AS OBJECT
(
Street VARCHAR2(50),
City VARCHAR(50)
);
Create Type name_objtype AS OBJECT
(
firstname VARCHAR2(50),
lastname VARCHAR(50)
);
然后创建一个表,定义其中的属性是对象类型。
Create table people_reltab
(
ID BUMBER(10),
address_objtype adress,
name_objtype name
);
抽象数据类型(Abstract Data Type,ADT)
定义
SQL3允许用户创建指定的带有自身行为说明和内部结构的用户定义类型称为抽象数据类型。
ADT一般形式
CREATE TYPE <type name>(
所有属性名及其类型说明,
[定义该类型的等于=和小于<函数,]
定义该类型其他函数(方法)
);
ADT特点
1) ADT的属性定义和行类型的属性定义类同。
2) 在创建ADT的语句中,通过用户定义的函数比较对象的值。如果不定义该类型的比较函数,则采用默认的等于和小于函数来比较对象的大小。
3) ADT的行为通过方法methods、函数function实现。
4) SQL3要求抽象数据类型是封装的,而行类型则不要求封装。
5) ADT有3个通用的系统内置函数,构造函数(Construction Function)、观察函数(Observer function)和删除函数(Mutation Function)。
- 构造函数用来生成对象值。
- 观察函数用来读取属性值。
- 删除函数用例修改和删除属性值,与update和delete类似。
6) ADT可以参与类型继承。
3、参照类型(Reference Type)
概念
SQL3提供了一种特殊的类型:参照类型,也称为引用类型,简称REF类型。因为类型直接可能具有相互参照的联系,因此引入了一个REF类型的概念:
REF<类型名>
REF类型总是和某个特定的类型相联系。它的值是OID。OID是系统生成的,不能修改。
例子1
Create ROW TYPE employee_type (
Name VARCHAR(35),
Age INTEGER
);
Create ROW TYPE Comp_type (
Compname VARCHAR(20),
Location VARCHAR(20)
);
然后创建基于行类型的表:
Create table Employee OF employee_type
Create table Company OF Comp_type;
实际应用中Employee的元组与Company中的元组存在相互参照关系。即某个职工在某个公司工作,可以使用REF类型描述这种参照关系。
Create ROW TYPE Employment_type(
Employee REF (employee_type),
Company REF(Comp_type)
);
Create table Employment OF Employment_type;
这样,表Employment中某一个元组的employee属性值是某个职工的OID,company属性值是该职工所在公司的OID。从而描述了职工和公司的相互参照关系。
例子2
Create table address_objtab OF address_objtype;
Create table people_reltab2(
Id NUMBER(5) primary key,
Name_obj name_objtyp,
Address_ref REF (address_objtyp) SCOPE IS address_objtab
);
people_reltab2表中的参照列address_ref存在参照对象的OID,SCOPE IS用来限定锁参照的对象在一个确定的表address_objtab的范围内。这样做的好处就是,尅在参照列伤简历索引,从而提高查询效率。
例子3
Create index address_ref_idx ON people_reltab2(Address_ref);
例子4
Select id
From people_reltab2 P
Where p.address_ref.city=’ 北京’ and p.address_ref.street=’上下九’;
4、继承性
概念
ORDBMS应该支持继承性,一般是单继承性。
例子
Create type emp_type
Under person_type AS(
Emp_id integer,
Salary real)
NOT FINAL;
NOT FINAL表示不是类层次结构中最后的叶节点,FINAL则表示该类型是类层次结构的叶节点。
5、子表和超表
概念
SQL3支持子表和超表的概念。超表、子表、子表的子表也构成一个表层次结构。表层次结构和类型层次结构概念十分相似。
如果一个基表是用类型来定义的,那么它可以有子表或者超表。
例子
Create TYPE person
(
Id integer, name VARCHAR(20),birthday INTEGER,addresss VARCHAR(40)
)NOT FINAL;
Create Type employee
UNDER person
(salary INTEGER)
NOT FINAL;
Create TYPE executive
UNDER employee
(bonus INTEGER)
FINAL;
Cretate TYPE student
UNDER person
(major VARCHAR(10),wage DECIMAL)
FINAL;
基于这些类型可以定义以下的基本表和层次表:
Create table person_table OF person
(name WITH OPTIONS NOT NULL);
Create table employee_table OF employee
UNDER person_table;
Create table executive_table OF executive
UNDER employee _table;
Create table student _table OF student
UNDER person_table;
这些表就构成了一个表层次。子表可以继承父表的属性、约束条件、触发器等,子表可以定义自己的新属性。
可以使用SQL的select,insert,delete,update语句对这些表进行操作。对某个表的查询起始是对该表和它所有子表中对象集合的查询。这个是表的多态
Select name ,address
From person_table
Where birthday<=1970;
这个查询是要找出person_table表上1970年后出生的人。查询结果包括了employee_table、executive_table、student_table表上所有人。
可以使用ONLY关闭对子表的检索。办法是在FROM子句中使用ONLY将检索的对象限制为指定表的对象,而不是对该表和子表中的对象。
如下:
Select name ,address
From ONLY person_table
Where birthday<=1970;
这个只找出person_table表上1970年后出生的人,没有包括了employee_table、executive_table、student_table表上的。
insert,delete,update语句也是同样的规则。