北京邮电大学软件工程研究生的课程---数据库设计开发-0-4

PPT
  • 阅读 61 次
  • 下载 0 次
  • 页数 39 页
  • 大小 127.945 KB
  • 2023-07-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档22.00 元 加入VIP免费下载
此文档由【精品优选】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
北京邮电大学软件工程研究生的课程---数据库设计开发-0-4
可在后台配置第一页与第二页中间广告代码
北京邮电大学软件工程研究生的课程---数据库设计开发-0-4
可在后台配置第二页与第三页中间广告代码
北京邮电大学软件工程研究生的课程---数据库设计开发-0-4
可在后台配置第三页与第四页中间广告代码
北京邮电大学软件工程研究生的课程---数据库设计开发-0-4
北京邮电大学软件工程研究生的课程---数据库设计开发-0-4
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 39
  • 收藏
  • 违规举报
  • © 版权认领
下载文档22.00 元 加入VIP免费下载
文本内容

【文档说明】北京邮电大学软件工程研究生的课程---数据库设计开发-0-4.pptx,共(39)页,127.945 KB,由精品优选上传

转载请保留链接:https://www.ichengzhen.cn/view-290405.html

以下为本文档部分文字说明:

1.4对象关系数据库•传统关系型仅支持简单数据类型;不支持数组、嵌套和递归的数据结构,给新型数据模型-面向对象的数据模型提供了应用背景。•面向对象的程序设计思想和技术促进了面向对象的数据模型的实现和应用-OODBS(面向对象数据库)。•习惯于‘填表’方式的客户不太愿意接受对象模型,

而且面向对象数据库系统与编程语言集成度高,没有统一可行标准;OODBS只占很小的市场分额。•以关系数据库和SQL为基础扩展关系模型-对象关系数据库(ORDBMS)的发展满足了许多应用需求。郭文明2003.06.051.4对象关系数

据库•ORACLE、DB2UDB、INFORMIX都推出ORBMS,ANSI/ISO发布的SQL-99标准是一个对象关系标准。1.4.1面向对象数据模型1.4.1.1对象与标识1.4.1.2类和类层次1.4.1.3继承和嵌套1.4.1.4面向对象数据库1.4.2ORACLE对象关系库1.4.

2.1ORACLE中对象类型1.4.2.2ORACLE中汇集类型1.4.2.3PL/SQL过程、用户定义函数和方法1.4.3对象关系数据库1.4.3.1对象联系1.4.3.2ORDB数据定义1.4.3.3ORDB数据查询1.4.3.4三种产品

的对象关系特征郭文明2003.06.051.4.1面向对象数据模型•面向对象数据库系统(ObjectOrientedDatabaseSystem,OODBS)是数据库技术与面向对象程序设计方法相结合的产物;面向对象程序设计方法的主要活动在建立对象和对象之间的联系;面向对象数据库系

统一般依赖于一个面向对象的程序设计语言.一个面向对象数据库系统是一个持久的、可共享的对象库的存储和管理者;而一个对象库是由一个OO模型所定义的对象的集合体。•面向对象数据模型是用面向对象观点来描述现实世界实体的逻辑组织、对象间限

制、联系.面向对象程序设计语言中建立的对象自动保存在磁盘上即OODBS面向对象数据库的用户主要是应用软件系统软件开发专业程序员郭文明2003.06.051.4.1面向对象数据模型•面向对象数据模型的主要观点:对象:对象是基本的数据结构,现实世界的任一实体都被统一模型化为一个对象,每

个对象有一个永久标识;对象可以被指定为一个给定类型,还可以定义为其它对象的子类型;封装:每一个对象是其状态与行为的封装。封装的状态为属性,行为为方法。对象与外部通信一般只能通过显式的消息传递。继承:子类型继承父类型的所有特性和行为.面向对象的核心观点构成O

O模型的基础,没有像关系模型那样的规范说明。如果与面向对象数据库相比,RDBMS可以称为面向表的数据库。郭文明2003.06.051.4.1.1对象与标识•对象是由一组数据结构和在这组数据结构上的操作的程序代码封装起来的基本单位,包括

:属性、方法和消息。•面向对象的数据库系统在逻辑上和物理上从面向记录上升为面向对象、面向可具有复杂结构的一个逻辑整体。•面向对象数据库中的每一个对象都有一个唯一的不变的标识(OID)。创建对象时系统就给它赋予一个OID,直到它被删除。•外部与对象的通信

只能通过消息,隔离了对象的实现与对象的应用,提高数据独立性。•查询属性值通过调用方法,不象关系系统那样使用SQL,不够方便灵活。ORDBMS中不支持封装,可即席查询郭文明2003.06.051.4.1.2类

和类层次•相似对象的集合称为类,每个对象称为它所在类的一个实例,一个类中的所有对象共享一个定义,它们的区别仅在与属性的取值不同.类本身也可以看作一个对象(类对象).•面向对象数据模型提供类层次结构,一个面

向对象数据库模式可能有多个类层次(超类和子类),在一个类层次中,一个类继承其所有(直接和间接的)超类的全部属性、方法和消息.超类是子类的抽象,子类是超类的特殊化.对相似对象的重复定义十分浪费,将相似对象分组形成一个“类”不同类的对象可以共享他

们公共部分的结构和特性郭文明2003.06.051.4.1.2类和类层次•类层次可以动态扩展,一个新的子类能从一个或多个已有类导出。•面向对象数据库中,类是“型”,对象是某一类的一个“值”.类属性的定义域可以是任何类(基本类或包含属性和方法的一般类)。•面向对象数据库模式是类的集合,类

可能有多个类层次。例如:一个学校应用的面向对象数据库,其中有教职员工和学生两个类,这两类都有身份证号、姓名、性别、住址等属性,也有相同的方法和消息。统一定义教职员工和学生的公共属性、方法和消息部分,称为一个类“人”;分别定义各自的特殊属性、方法和消息部分,分别称为教职员工类和学生类,教

职员工类和学生类定义为人的子类。郭文明2003.06.051.4.1.3继承和嵌套•子类继承超类的特性,避免许多重复定义.这种继承性有两优点:是建模的有力工具;提供信息重用机制.封装和继承导出多态性.•子类可以定义自己特殊的属性、

方法和消息,在定义这些特殊的属性、方法和消息时可能与超类或多个超类之间发生冲突.这种冲突由系统解决,不同系统使用不同的冲突解决方法.•一个对象属性可以是另一个对象称为对象的嵌套.这样一来,不仅类之间具有层次结构,而且某一个类内部也具有嵌套层次结构,形成对象横向和纵向的

复杂结构.不像RDBMS中的平面结构郭文明2003.06.051.4.1.4面向对象数据库•在OODB中,与对象模型密切相关的是面向对象数据库语言。OODB语言主要包括对象定义语言(ODL)和对象操纵语言(OML),对象操纵语言一个重要子集是对象查询语言(OQL

)。•OODB语言一般应具备类的定义与操纵、操作/方法的定义、对象的操纵功能。•面向对象数据库语言的研制是OODB系统开发中的重要部分,人们试图扩充面向对象程序设计语言OOPL的查询语言或者扩充SQL的功能,目前还没有像SQL那样的关于面向对象数据库语

言的标准。不同的OODBMS其具体的数据库语言各不相同。RDBMS中有数据定义DDL、数据操纵DML、数据控制DCL郭文明2003.06.051.4.2ORACLE对象关系库(对象关系模型)•对象关系模型支持用户类型定义(ORACLE称对象类型;INFORMIX称行类型;DB2UDB称用户定义

类型).一个表是包含用户定义类型的多个行.•对象关系模型允许一个行包括一个行值汇集(如数组或单个列自身是一个表).•面向对象数据库中,只能通过对象的方法操纵对象,在对象关系模型中,所有对象被看作是公共的而并非私有的,通过SQL即可操纵对象,当然也可使用用户定义的函数.显然,对象关

系模型违反第一泛式规则显然,对象关系模型没有面向对象数据模型和关系模型那样严格郭文明2003.06.051.4.2ORACLE对象关系库(一个例子)职工号姓名职务家属关系姓名0001张家口职员妻子李小玫儿子张冠李0002柴米油经理妻子陆续琴0003郝成功职员

妻子朱那亚儿子郝乃军女儿郝佳欣家属属性有内部数据结构,对象类型每个行中包含多个值,汇集类型郭文明2003.06.051.4.2.1ORACLE中对象类型•一个对象类型有多个类型属性,ORACLE中对象类型由Createtype语句创建.例:

createtypenamesex_tasobject(namechar(8),sexchar(2));/createtableemployees(eidchar(4),enamenamesex_t,jobchar(6));

insertintoemployeesvalue(‘0001’,namesex_t(‘赵子龙’,’男’),’经理’);selecte.eid,e.ename.name,e.ename.sexfromemployeesewheree.job=‘业务员’;SQL

*plus中创建对象必须有/前面‘表名.’不能省略typename(属性值)称为对象构造器郭文明2003.06.051.4.2.1ORACLE中对象类型•创建对象的一般格式:CREATETYPEtypenameASOBJECT(属性名类型[,属性名类型…]);

(informix中用createrowtyperowname(),行类型)•若ORACLE中表的行包含对象类型,则称为对象表(informix中称类型表).采用如下形式定义表:CREATETABLEtablenameOFtypename[([属性名NOTNULL][,属性名NOTN

ULL…][,PRIMARYKEY(属性名[,属性名…])])];•DROPTYPEtypename[FORCE];DROPTABLEtablename;可以是其他用户已经定义的类型,由此形成对象的嵌套和依赖typename对象中属性即成为表中属性郭文明2003.06.051.4.2.1OR

ACLE中对象类型•例:createtypeemployee_tasobject(eidchar(4),enamenamesex_t,jobchar(6));createtableemployeesofemployee_t(primarykey(eid));•对象表(包含行对

象employee_t和列对象ename)无名顶层列employees顶层属性eidenameJobename属性ename.nameename.sex行10001赵子龙男经理行20002张翌德男职员行30003孟可飞女职员郭文明2003.06.051.4.2.1ORACLE中对象

类型•可用嵌套的点号访问一个对象的属性,无名顶层列可以用VALUE()形式引用行对象.select*fromemployeesewheree.job=‘经理’;selectvalue(e)fromemployeesewheree.job=‘经理’

;selecte.eid,e.jobfromemployeesewheree.ename=namesex_t(‘孟可飞’,’女’);eidename(name,sex)job0001namesex_t(‘赵子龙’,’男’)经理value(e)(eidename(

name,sex)job)employee_t(0001namesex_t(‘赵子龙’,’男’)经理)行对象列对象对象构造器郭文明2003.06.051.4.2.1ORACLE中对象类型•INSERT和UPDATE同样可以使用对象构造器.insertintoemployeesvalues(

‘0004’,namesex_t(‘胡作为’,’男’),null);updateemployeesesete=employee_t(‘0004’,namesex_t(‘胡有为’,’男’),‘职员’)whereeid=‘0004’;•ORACLE为每个行对象提供一个唯一标识(对象标识符

).一个表的列可被定义为REF(引用)的内部数据类型,允许它‘指向’一个对象表的行对象.对象的REF与对象自身具有不同类型.郭文明2003.06.051.4.2.1ORACLE中对象类型createtypec_tasobject(…);createtypea_tasobj

ect(…);createtypep_tasobject(…);createtypeo_tasobject(ordnoint,monthchar(2),cidchar(3),aidchar(3),pidchar(

3),qtyint,dollarsdoubleprecision,ocrefc_t,oarefa_t,oprefp_t);createtablecofc_t(primarykey(cid));createtableaofa_t(primarykey(aid));

createtablepofp_t(primarykey(pid));createtableoofo_t(primarykey(ordno),scopefor(oc)isc,scopefor(oa)isa,scopefor(od)isp);想着外码,理解REF•例:郭文

明2003.06.051.4.2.1ORACLE中对象类型•一般通过REF访问比通过连接访问的效率高.超过200元的订单号和顾客名:selectx.ordno,x.oc.cnamefromoxwherex.dollars>200;•获得引用(REF)对象值的函数REF().没有通过代理商a05订货

的顾客名:selectx.cnamefromcxwherenotexists(select*fromoywherey.oc=ref(x)andy.aid=‘a05’);通过北京的所有代理商订货的顾客cid:selectx.cidfromcxwherenotexists(select

*fromaywherey.city=‘北京’andnotexists(select*fromozwherez.oc=ref(x)andz.oa=ref(y)));不存在北京代理没有和该顾客订货郭文明2003.06.051.4.2.1ORACLE中对象类型•一个对象类型

不能嵌套包含与自己类型相同的成分(递归),但可以包含对同样类型的引用.建一个配偶对象表:createtypemate_tasobject(midchar(4),mnamenamesex_t,partnerrefmat

e_t);createtablematesofmate_t(primarykey(mid),scopefor(partner)ismates);检索其配偶为女性的人名:selectmname.namefrommatesmwherem.partner.mname.s

ex=‘女’;•一个表集合可以具有一个用ref表示的复杂关系集.如雇员有部门,部门有经理,经理又是雇员.回路的依赖中删除时用DROPTYPE…FORCE.郭文明2003.06.051.4.2.2ORACLE汇集类型•ORACLE有两种汇集类型:表类型和数组类型.汇集类型是数据库成熟的数据

类型,经过适当的转换,可以在查询中解释为表.•表类型和嵌套表创建:CREATETYPEtypenameASTABLEOFobj_name;CREATETABLEtablename(属性名类型[NOTNULL][…])[NESTEDTABLE属性名STOREASta

blename][,NESTEDTABLE属性名STOREAStablename…];已建的对象表类型名表类型的属性父表子表郭文明2003.06.051.4.2.2ORACLE汇集类型•例:createtypedepe_tastableofnamesex_t;createt

ableemployees(eidchar(4),enamenamesex_t,dependentsdepe_t,primarykey(eid))nestedtabledependentsstoreasd_tab;eidenameDependents0001

namesex_t(‘张家口’,‘男’)namesex_t(‘李小玫’,‘女’)namesex_t(‘张冠李’,‘男’)0002namesex_t(‘柴米油’,‘男’)namesex_t(‘陆续琴’,‘女’)t(‘郝成namesex_t(‘朱那亚’,‘女’)t(‘郝乃郭文明2003.06

.051.4.2.2ORACLE汇集类型•子表的数据只能通过父表来访问.检索0001号职工的家属:selectdependentsfromemployeeswhereeid=‘0001’;检索有2个家属以上的职工eid:selecteidfrom

employeesewhere2<(selectcount(*)fromtable(e.dependents));检索0003号职工的家属数目:错误:selectcount(*)from(selecte.dependent

sfromemployeesewheree.eid=‘0003’);错误:selectcount(*)from(selecttable(e.dependents)fromemployeesewheree.ei

d=‘0003’);正确:selectcount(*)fromtable(selecte.dependentsfromemployeesewheree.eid=‘0003’);对象列必须加限定非对象列不加Table

()将e.dependents转换为一表郭文明2003.06.051.4.2.2ORACLE汇集类型•利用表的乘积可以消除表的嵌套.显示职工号和其家属名:selecte.eid,d.namefromemployeese,table(e.dependents

)d;selecte.eid,d.namefromemployeese,table(e.dependents)(+)d;显示具有最大家属名的职工号和其家属名:selecte.eid,d1.namefromemployeese,table(e.dependents

)d1whered1.name=(selectmax(d2.name)fromtable(e.dependents)d2);(+)表示外连,没有家属的eid也显示没有家属的eid不显示郭文明2003.06.051.4.2.2ORACLE汇集类型•O

RACLE的另一种汇集类型即数组类型,以VARRAY声明.createtypephone_tasvarray(4)ofint;createtableemployees(eidchar(4),enamenamesex_t,telephonephone_t,primarykey

(eid));eidenametelephone0001namesex_t(‘张家口’,‘男’)phone_t(12345678,23456789)0002namesex_t(‘柴米油’,‘男’)phone_t(3456

7890)0003namesex_t(‘郝成功’,‘男’)phone_t(45678901,56789012,67890123)郭文明2003.06.051.4.2.2ORACLE汇集类型•SQL语句不能访问数组的下标.在嵌入主语言后,从一行检索的数组可付给编程语言的数组.TA

BLE()可以应用于VARRAY.例:列出电话号码为45678901的人:selecteid,enamefromemployeesewhere45678901in(select*fromtable(e.telep

hone));•汇集类型(表类型和数组)的更新用汇集构造器.Insertintoemployeesvalues(‘0006’,namesex_t(‘孙子兵’,‘男’),phone_t(68888888,96666666));Updateemployeessettelephone=phone_t

(80166666,80166667)whereeid=‘0001’;汇集构造器郭文明2003.06.051.4.2.3PL/SQL、用户定义函数和方法•非过程的SQL不具备计算的完整性。ORACLE引入PL/SQL,INFORMIX引入SPL,SQLSERVER引入T-SQL.过程SQL支

持内存驻留变量、条件和循环结构、过程和函数等。•一个用过程SQL编写的函数在服务器上执行时被称为存储过程,由CreateFunction语句记录在服务器上的数据库目录表中。•触发器是可以在任意事件发生时执行的过程性SQL语句块。触发器用于实现定制的约束或缺省行为。•用户定义函数(UDF)是用过程性

SQL(或C、Java)写的函数,可以像交互式SQL中的内部函数一样被调用。•方法是与用户定义类型一起定义的用户定义函数。郭文明2003.06.051.4.2.3PL/SQL、用户定义函数和方法•例:对象关系数据库中利用对象类型定义表、利用用户定义函数定义对象

的方法。•1)定义对象点(point_t)和矩形(rectangle_t)及其方法inside(point_t)(点是否在矩形对象内)和area()(矩形面积).定义点对象createtypepoint_tasobject(xint,yint);定义包含方法的矩形对象creat

etyperectangle_tasobject(pt1point_t,pt2point_t,memberfunctioninside(ppoint_t)returnint,memberfunctionareareturnint);成员函数

,实际是对象的方法郭文明2003.06.051.4.2.3PL/SQL、用户定义函数和方法createtypebodyrectangle_tasmemberfunctionareareturnintisbegin--成员函数area定义return(s

elf.pt2.x-self.pt1.x)*(self.pt2.y-self.pt1.y);end;--成员函数area没有参数,返回长乘宽.memberfunctioninside(pinpoint_t)returnintisbeginif(p.

x>=self.pt1.x)and(p.x<=self.pt2.x)and(p.y>=self.pt1.y)and(p.y<=self.pt2.y)thenreturn1;elsereturn0;endif;end;--成员函数inside参数为点类型的p,当p在矩形中时

返回1,否则返回0.end;郭文明2003.06.051.4.2.3PL/SQL、用户定义函数和方法•2)创建point_t和rectangle_t类型的对象表.createtablepointsofpoint_t(primarykey(x,y));createtablerectsofrecta

ngle_t(primarykey(pt1.x,pt1.y,pt2.x,pt2.y));插入两个矩形:insertintorectsvalues(point_t(1,2),point_t(3,4));insertintorect

svalues(point_t(1,1),point_t(6,6));插入三个点:insertintopointsvalues(2,3);insertintopointsvalues(1,4);insertintopointsvalues

(4,4);郭文明2003.06.051.4.2.3PL/SQL、用户定义函数和方法•3)使用方法area和inside.计算rects表中矩形面积:selectvalue(x),x.area()fromrectsx;

判断点(4,2)是否在每个矩形中:selectvalue(x),x.inside(point_t(4,2))fromrectsx;查询在所有矩形内的所有点:selectvalue(p)frompointspwherenotexists(select*fromrectsrwherer.in

side(p)=0);计算覆盖各点的最小矩形的面积:selectp.x,p.y,min(r.area())fromrectsr,pointspwherer.inside(value(p))>0groupbyp.x,p.y;将面积小于2

4的矩形的pt2横纵坐标加1:updaterectsrsetpt2=point_t(r.pt2.x+1,r.pt2.y+1)wherer.area()<24;郭文明2003.06.051.4.2.3PL/SQL、用户定义函数和方法•定义包含方法的对象CREATETY

PEtypenameASOBJECT(attrnamedatatype[,attrnamedatatype…]MEMBERFUNCTIONmethodname[(paramtype[,paramtype…])]RETU

RNdatatype,[,MEMBERFUNCTIONmethodname[(paramtype[,paramtype…])]RETURNdatatype,…]);在前面对象类型的基础上增加了MEMBERFUNCTION语

句,定义对象的成员函数,即方法。郭文明2003.06.051.4.2.3PL/SQL、用户定义函数和方法•对象成员函数的定义CREATE[ORREPLACE]TYPEBODYtypename[AS|IS]MEMBERFUNCTIONmethodname[(paramtyp

e…)]RETURNtypeISBEGIN--PL/SQL语句开始statementsEND;--PL/SQL语句结束[MEMBERFUNCTIONmethodname[(paramtype…)]RETURNtypeisBEGIN……]EN

D;对于不同的DBMS,对象成员函数的处理过程使用的语句可能不同,带来移植的通用问题。郭文明2003.06.051.4.3对象关系数据库•对象关系数据库系统除具有原来关系数据库的各种特点外,还应该提供以下特点:•1)扩充数据类型:允许用户根据自

己应用需求定义自己的数据类型、函数和操作符。例如可以定义数组、向量、矩阵、集合以及这些数据类型上的操作。•2)支持复杂对象:复杂对象指由多种基本类型或用户定义类型构成的对象。•3)支持继承:支持子类、超类的

概念,支持属性数据和函数及过程的继承。•4)提供通用的规则系统:规则在DBMS及其应用中十分重要,传统DBMS中的触发器可以看作规则的一种形式。郭文明2003.06.051.4.3.1对象联系•关系模型中基本的数据结构层次是关系-元组-属性,属性类型是基

本类型.•嵌套关系模型是平面关系模型的扩展,允许关系的属性又是一个关系.•嵌套关系模型进一步扩展,出现复合对象模型.关系中的属性可以是基本类型,也可以是结构类型或集合类型.关系基本类型关系关系基本类型关系关系基本类型结构类型关系模型嵌套关系模型复合对象模型郭文

明2003.06.051.4.3.1对象联系•嵌套关系和复合对象类型定义时不能允许递归,否则可能造成无穷嵌套,语义混乱.采用‘引用’技术(Reference)可解决类型定义中的递归问题.在属性类型中有基本类型、结构类型、关系类型和引用

类型.引用类型相当于程序设计中指针概念.•数据的泛化和细化引出对象类型的层次.较高层对象类型为超类,较低层对象类型为子类,子类型继承超类型的特征.而子类型又有本身的其他特征.郭文明2003.06.051.4.3.2对象关系数据定义•对象关系模型中

,属性可以是复合类型:1)结构类型:不同类型元素的有序集合;2)数组类型:同类元素的有序集合;3)集合类型:同类元素的无序集合.数据类型可以嵌套.•继承性表现在类型的继承和表的继承.子类型继承超类型的特征;子表继承父表的特征.•数据类型可以嵌

套定义,但要实现递归,就要采用‘引用’类型.郭文明2003.06.051.4.3.3对象关系数据查询•当属性值为单值或结构值时,属性的引用方式在层次间加圆点‘.’•聚集函数(max、min、count等)可以

应用于任何以关系为值的表达式中,以关系作为参数,返回单个值.•当属性值为一个集合时,应当将嵌套的集合转换为常规的表的形式(解除嵌套).•在数据更新时,充分注意数据定义的形式,利用‘对象构造器’.也可以利用将常规关系转换为嵌套集合形式的函数完成

(解除嵌套的逆过程).郭文明2003.06.051.4.3.4三种产品的对象关系特征ORACLEINFORMIXDB2UDB用户定义类型(UDT)有,结构化的‘对象类型’有,结构化的‘行类型’有,结构化的UDT继

承无有有UDT引用有无有集合类型有,嵌套表、VARRAY有,集合,多集合,列表无用户定义函数(UDF)有,PL/SQL,C,Java有,SPL,C,Java有,C,Java封装的UDTBLOB(BinaryLargeOBject)对象BLOB对象BLOB对象打包UDTCartridgeDa

taBladExtenderBLOB尺寸4G-14T2G-1BLOB子串UDF访问UDF访问UDF访问郭文明2003.06.05作业:1.对象关系数据库特点.2.行对象与列对象有何不同?3.Value(),Ref(),Table()的作用?4.s

tudent_t类型中有namesex_t类型以及学号id、e-mail和入学年份(整数),其中namesex_t不空.定义student_t类型和表student,学号id.5.对对象关系数据库CAP,查找

姓李的代理商aid和aname,这些代理商没有销售过北京的商品.6.检索在三个以上矩形中出现的点,显示点和覆盖这些点的矩形数.郭文明2003.06.05

精品优选
精品优选
该用户很懒,什么也没有留下。
  • 文档 34925
  • 被下载 0
  • 被收藏 0
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?