对象关系数据库.docx
- 文档编号:11756484
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:36
- 大小:46.06KB
对象关系数据库.docx
《对象关系数据库.docx》由会员分享,可在线阅读,更多相关《对象关系数据库.docx(36页珍藏版)》请在冰豆网上搜索。
对象关系数据库
对象关系数据库
一.关系模型与对象模型
1.关系模型的特点
强调数据的独立性(以数据为中心),数据与程序分离。
采用关系模型、概念单一,实体和联系都是用关系来表示。
关系必须是规范化的关系,要求每一分量不可再分。
支持关系语言,具有高度非过程化,支持集合运算
通过外来码实现表的连接(多表查询)
2.扩充的类型系统
是对关系数据模型进行的扩充。
提供更为丰富的面向对象的类型系统。
扩充的类型系统允许元组的属性值为复杂类型,在关系查询语言中增加处理新数据类型的成分。
(a)既保留关系模型基础
(b)又提高建模能力
对象关系模型为希望使用面向对象特征的关系数据库用户提供可能。
3.面向对象数据库
数据库中不是只存储单纯的数据,而是存储包含属性和方法的对象。
对于一个数据库对象,可定义在其上运行的过程和函数。
使数据库中的数据和访问该数据的方法联系起来,可标准化数据访问的方法并提高对象的可复用性。
应用逻辑从应用程序中移动到数据库中(对象方法)
创建通用的数据库对象,并能成为数据库对象的标准,可实现数据库对象的重用。
4.对象模型与关系模型
对象模型
对象类型的属性描述
对象类型的方法封装了操作该对象的代码。
提供了处理数据库中数据的界面。
关系模型
二维表中列的定义
没有方法
a.另编程b.可使用操作某数据库表的存储过程。
面向对象数据模型中的类概念—实体集概念。
面向对象数据模型中的对象概念—实体概念
5.Oracle的扩充类型
(1)Oracle是一个开放的类型系统,增加了复杂的数据类型以及用户自定义类型
(2)用户定义的数据类型使得可以在数据库中为现实世界的对象建模
对象类型(记录类型)数组类型嵌套表类型
(3)创建对象表,实现面向对象的数据库设计(而非关系型数据库设计)。
应用逻辑从应用程序中移动到数据库中(对象方法)
二.利用对象类型定义复合数据类型
1.用户自定义数据类型
使用对象类型定义一个记录数据类型
CREATETYPEname_typeASOBJECT
(first_nameVARCHAR2(4),last_nameVARCHAR2(4));
CREATETYPEaddress_typeASOBJECT
(cityVARCHAR2(10),streetVARCHAR2(10),zipNUMBER(6));
CREATETABLEworker
(widNUMBER(5)PRIMARYKEY,
wnamename_type,
addressaddress_type);
2.对象类型数据的操作
(1)使用对象类型声明了关系表中的列,DML语句必须用一些特殊的语法
(2)插入新记录时,对于对象类型的列,要使用构造函数构造出对应类型的数据。
(3)构造函数是对象类型的特殊方法,利用此方法为该类型创建对象。
构造方法的名称与对象类型(类)同名。
(4)对记录型数据的分量进行操作时,要使用“别名”
插入语句例:
insertintoworkervalues(1,name_type('王','至远'),
address_type('北京','白颐路5号',100084));
insertintoworkervalues(2,name_type(‘张’,‘大年'),
address_type(‘天津’,‘康宁里20号’,300072));
insertintoworkervalues(3,name_type('赵','力平'),
address_type('上海','南京路23号',200092));
查询语句1:
select*fromworker;
查询语句2:
selectwid,wnamefromworker;
WIDNAME(FIRST_NAME,LAST_NAME)
----------------------------------------------------------
1NAME_TYPE(‘王’,‘至远’)
2NAME_TYPE(‘张’,‘大年’)
3NAME_TYPE(‘赵’,‘力平’)
3.对象类型数据的查询
查询语句3(用别名)
selectwid顾客编号,w.address.city城市,w.address.street街道,w.address.zip邮编
fromworkerw;
查询语句4(别名的使用)
select*fromworkerworderbyw.address.zip;
4.对象类型数据的操作
修改
updateworkerwsetw.address.zip=100083wherewid=1;
删除
deletefromworkerwherewid=1;
deletefromworkerwwherew.wname.first_name=‘张’;
修改表结构
altertablecustadd(address1address_type);
不能对表修改自定义的数据类型格式
5.用户自定义数据类型
(1)对象类型更加贴近现实世界的数据特征。
(2)使用对象类型可以更加统一、自然地声明和操作表中的数据(在整个数据库中地址一致性)
(3)创建可为大家引用的新数据类型:
a.创建一个模式(如pub)b.建立公共对象类型(新数据类型)
c.设置必要的权限
(4)使用
CREATEPROCEDUREnew_worker(
widNUMBER,namepub.name_type,addresspub.address_type);
6.自定义数据类型上的索引
createindexaaaonworker(wname);
ORA-02327:
无法在具有数据类型ADT的列上创建索引。
(即使在name_type类中定义了排序方法也不可以)
(1)如经常进行如下查询:
selectwid顾客编号,w.address.city城市,w.address.street街道,w.address.zip邮编
fromworkerwwherew.address.zip=100084;
(2)可建索引如下:
createindexI_ziponworker(address.zip);
三.使用对象表—面向对象数据库设计
1.建立对象表的类
建类型(对象类型声明)
createtype类型名asobject(
属性名1类型说明,
属性名2类型说明,
…...
memberfunction函数名(参数说明)
return返回类型,
memberprocedure过程名(参数说明),
…
);
2.对象属性类型
对象类型必须包含一个或多个属性,属性的类型可以是:
Oracle的原始数据类型LOB对象
对象的引用(REF)收集(COLLECTION)等
3.对象方法
(1)方法是一个过程或函数,是对象类型定义的一部分,是程序员编写的用于操纵对象属性的子程序,被封装在对象类型中。
(2)方法的种类:
a.成员方法(member)b.构造方法(constructor)
c.MAP或ORDER方法(排序方法)
(3)一个类可以有多个方法(也可以不定义方法)
(4)对象类型不存储数据;必须创建相应的表来存储数据
4.编写方法代码
建类型体(实现类成员方法)
createtypebody类型名AS
memberfunction函数方法名(参数说明)
return返回类型
is
说明部分
begin
执行部分
end;
memberprocedure过程方法名(参数说明)
is
说明部分
begin
执行部分
end;
END;
5.建立对象表
建对象表
Createtable表名of对象类型(…);
例:
CREATETYPEemployee_typeASOBJECT(...);
CREATETABLEemployeesOFemployee_type
(empnoconstrainte1primarykey);
表定义的其他说明,如完整性约束等,表的列不能再定义
CREATETYPEBODYemployee_type(…);
6.建立对象类型例
CREATETYPEemployee_typeASOBJECT(
EmpnoNUMBER(3),EnameVARCHAR2(10),
salNUMBER(6,2),hiredateDATE,
MEMBERFUNCTIONdays_at_company
RETURNNUMBER,
MEMBERPROCEDURE
raise_salary(increment_salNUMBER)
);
/
7.创建对象表
CREATETABLEemployeesOFemployee_type(
PRIMARYKEY(empno),
UNIQUE(ename),
CHECK(sal>300)
);
8.建立对象类型体
CREATEORREPLACETYPEBODYemployee_typeAS
MEMBERFUNCTIONdays_at_company
RETURNNUMBERIS
BEGIN
RETURNfloor(sysdate-hiredate);
END;
MEMBERPROCEDURE
raise_salary(increment_salNUMBER)IS
BEGIN
UPDATEemployees
SETsal=sal+increment_sal
WHEREempno=SELF.empno;
END;
END;
9.对方法的限制
(1)编译软件包中的函数或过程时,可以使用PRAGMA编译指令通知PL/SQL编译器禁止某方法对数据库表和包中的变量读写,当方法体中出现违反情况时,编译出错。
(2)格式:
PRAGMARESTRICT_REFERENCES(function_name,WNDS[,WNPS][,RNDS][,RNPS]);
WNDS不允许写数据库RNDS不允许读数据库
WNPS不允许改程序包变量RNPS不允许引用程序包变量
CREATEORREPLACETYPEemployee_typeASOBJECT(
empnoNUMBER,enameVARCHAR2(10),
salNUMBER,hiredateDATE,
MEMBERFUNCTIONdays_at_company
RETURNNUMBER,
MEMBERPROCEDURE
raise_salary(increment_salNUMBER),
PRAGMARESTRICT_REFERENCES(days_at_company,WNDS,WNPS));
10.对象类型--构造子方法
(1)Oracle自动地为每个对象类型创建一个构造方法。
(2)构造子方法的名称采用对象类型名。
(3)构造子方法的参数即对象类型的所有属性。
(4)构造子方法初始化一个对象类型的实例,并将它的属性赋值。
(5)例:
insertintoemployeesvalues(employee_type(1,‘Jone’,500,‘5-10月-1989’));
11.对象表操作
(1)建表
createtableemployeesofemployee_type;
(2)插入数据
insertintoemployees
values(employee_type(1,‘Jone’,500,‘5-10月-1989’));
下面插入语句省略构造方法:
insertintoemployeesvalues(1,‘Jone’,1500,‘5-10月-1989’);
insertintoemployeesvalues(2,'smith',700,‘10-5月-1997');
insertintoemployeesvalues(3,‘king’,‘900,25-12月-2000’);
12.获取行对象—value函数
(1)value(对象表别名)返回一个行对象(对象类型)
(2)value用于从对象表中取得对象实例。
(3)不使用value,SELECT只能返回一个对象的各个列值。
select*fromemployees;
EMPNOENAMEHIREDATE
---------------------------------------------------------------------
1Jone05-10月-89
2smith10-5月-97
3king25-12月-00
selectvalue(e)fromemployeese;
VALUE(E)(EMPNO,ENAME,HIREDATE)
--------------------------------------------------------------------
EMPLOYEE_TYPE(1,'Jone',‘05-10月-89')
EMPLOYEE_TYPE(2,’smith','10-5月-97')
EMPLOYEE_TYPE(3,’king',‘25-12月-00')
13.对象表方法调用
selectename,hiredatefromemployeeswhereempno=1;
selectename,e.days_at_company()daysfromemployeesewhereempno=3;
14.PL/SQL中对象方法的调用
(1)在PL/SQL程序中,取得的对象实例必须被相同类型的对象变量接收。
(2)例:
declare
empemployee_type;
begin
selectvalue(e)intoempfromemployeesewhereempno=1;
emp.raise_salary(500);
end;
/
DECLARE
emp_variablemployee_type;
days_employednumber;
BEGIN
SELECTVALUE(e)INTOemp_variableFROMemployeese
WHEREe.empno=3;
days_employed:
=emp_variable.days_at_company();
dbms_output.put_line(‘Daysemployed:
‘||to_char(days_employed));
END;
/
15.对象方法小结
(1)对象类型总是有1到多个方法(构造方法是隐含方法,成员方法为0~n个。
(2)成员方法可以带输入输出参数。
(3)每个成员方法含有名为SELF的隐含第一参数,它具有与对象类型自身相同的类型。
(4)定义函数方法,如没参数不用写括号,但调用时要写括号。
定义方法形参时,类型不用写长度,如varchar2
16.对象表的特性
(1)对象表是只用对象类型定义的数据库表,不含关系型列。
(2)对象表的列对应(用来创建表的)对象类型的属性。
(3)对象表的行是表类型的对象(实例),每一行都有一个系统分配的唯一的对象标识符(OID)
a.对象ID(OID)是每一个行对象的唯一描述符,是全局唯一的,并且可以引用
b.OID不用于定位数据,ROWID仍用于定位数据
(4)oracle通过对象引用实现数据库中不同对象之间的联系(与关系表完全不同)
17.获取对象引用—ref函数
(1)具有OID的对象实例可以被引用(REF)
(2)ref(对象表的别名)--返回对象表实例指针,即行对象的引用。
(3)例:
selectref(e)fromemployeese;
REF(e)
-------------------------------------------------------------------------------------
000028020965D...0BEFE0340800209ADC5901403BE50000
000028020965D...0BEFE0340800209ADC5901403BE50001
000028020965D...0BEFE0340800209ADC5901403BE50002
18.对象引用例
(1)建立对象表cust
createtypecust_typeasobject(
custidnumber(5),Namename_type,addressaddress_type);
createtablecustofcust_type(custidprimarykey);
(2)向cust表中插入数据
insertintocustvalues(1,name_type('王','至远'),
address_type(‘北京’,‘白颐路5号’,100084));
insertintocustvalues(2,name_type(‘张’,‘大年'),
address_type('天津','康宁里20号',300072));
insertintocustvalues(3,name_type('赵','力平'),
address_type('上海','南京路23号',200092));
(3)查询cust表
select*fromcustwherecustid=1;
selectc.address.city,c.address.zipfromcustcwherec.name.first_name=‘王’;
(4)修改cust表结构?
?
?
altertablecustadd(address1address_type);不允许!
!
!
(5)建立goods_type
CREATETYPEgoods_typeASOBJECT(
gnoNUMBER(3),gnamevarchar2(20),pricenumber(6,2));
/
CREATETABLEgoodsOFgoods_type(constraintp1primarykey(gno));
INSERTINTOgoodsVALUES(101,'电视机',2900);
INSERTINTOgoodsVALUES(102,'洗衣机',1500);
(6)CREATETYPEorder_typeASOBJECT(
orderidNUMBER(3),customerREFcust_type,orderdateDATE,
qtyNUMBER(5),gnoNUMBER(3));
/
(7)CREATETABLEordersOForder_type
(FOREIGNKEY(gno)REFERENCESgoods(gno));
19.对象表—对象引用
(1)REF是指向行对象的指针,易于实现表和表之间的联系,对象之间连接不再需要关系表的连接(JOIN)操作。
(2)将对象表的表别名作为REF的参数,可以取得对应OID的引用值。
(3)引用只能用于具有OID的对象。
(4)customerREFcust_typeSCOPEISCUSTSCOPE子句用于限定一个引用在一个指定表中,这样可以提高查询性能,并减少存储指针的空间。
20.引用类型数据的操作
INSERTINTOorders
SELECT1,ref(c),‘7-1月-2000’,165,101FROMcustcWHEREcustid=1;
UPDATEorders
SETcustomer=(SELECTref(c)FROMcustcWHEREcustid=2)
WHEREorderid=1;
SELECTcustomerFROMordersWHEREorderid=1;
SELECTo.customer.custid顾客号,o.customer.name.last_name名,
orderdate日期FROMordersoWHEREorderid=1
21.对象引用—简化了代码
(1)数据库管理对象间的连接,用户只需通过属性进行对象的引用。
(2)在关系设计中,开发人员必须使用联接(JOIN)
SELECTname,address,...FROMorderso,custc
WHEREo.custid=c.custidandorderid=1;
22.deref函数
(1)deref(ref指针)返回指针指向的对象本身
(2)例:
selectderef(customer)fromorderswhereorderid=1;
23.SQL语句中的排序和比较
(1)传统的数据类型主要为标量数据类型:
number,char,date
(2)标量数据类型可以排序(如orderby…)
(3)排序在SQL语句的使用:
a.关系运算(><=)b.between及in的判断
c.orderbygroupbydistinct子句d.unique和primarykey约束
(4)自定义数据类型如何排序
selectwname,addressfromworkerorderbyaddress;
错误位于第2行:
ORA-22950:
无法ORDER没有MAP或ORDER方法的对象
24.对象类型的排序方法
(1)同类的排序对支持用户定义的对象类型很重要。
(2)对象类型由于结构复杂,必须借助方法实现排序和比较。
a.MAP方法将对象类型转换为传统数据类型。
b.ORDER方法提供排序规则。
比较本对象和另一对象实例,并返回1,0,-1分别代表大于、等于、小于。
(3)一个对象类型只能有一个MAP方法或一个ORDER方法:
a.mapmemberfunction…b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 对象 关系 数据库