数据模型

概念数据模型:按照用户的观点来对数据和信息建模,E-R模型是概念数据模型的典型。
逻辑数据模型:从计算机实现的观点来对数据建模。
物理数据模型:从计算机的物理存储角度对数据建模。
逻辑数据模型的发展受到应用发展和需求的推动经过了以下四个时代:
文件系统 -> 层次和网状数据库 -> 关系数据库 -> 新一代数据库(OODB、ORDB)
目前广泛应用的关系数据模型又很多缺陷,第一:有限的数据类型,不支持自定义函数和运算,很难满足现实世界的要求。第二:不能清晰的表示和处理复杂对象,例如多值属性、组合属性、聚集。第三:缺少对象表示OID,这于显示世界不符。主键被关系数据库用来标识数据实体,但它又很多缺陷:主键发生变动,但数据实体是确定不变的;主键只在一定范围内有效,而数据实体往往是全局的;关系型的面向集合的数据操作虽然用起来方便,但很多情况下执行效率低。用OID来进行导航式的对象访问更直观、更有效。
随着面向对象技术应用到软件的各个领域,面向对象数据模型和对象关系数据模型应运而生。
OODB:用面向对象数据模型代替关系数据模型。
ORDB:将关系数据模型扩展为对象关系数据模型。
Oracle和DB2都在往对象关系数据库管理系统的方向发展。下面我们以Oracle为例给大家展现Oracle的对象特性。
从Oracle的Manager Console中我们可以看到Oracle把User Types分成了四类:Array Types、Table Types、Object Types和XML Schema。
首先我们来讲Object Types,在Oracle创建Object Types的方式是:
create type type_name as object(attr1_name attr1_type, attr2_name attr2_type
member function func_name1(参数说明) return 返回类型,
member function func_name2(参数说明) return 返回类型,
)
对象类型必须包含一个或多个属性,属性的类型可以是:数据库原有数据类型、LOB、对象(包括用户自定义的对象类型)、对象的引用(REF)、Collection。
例如:
create table circles(radius number, center point_type);创建一个包含点类型属性的表,它包含x和y坐标。
insert into circles values(1, point_type(1, 1));插入点一行数据。
select radius,center from circles;查询该表,但是这样看不到点的坐标。
select radius, c.center.x, c.center.y from circles c;这样查询可以看到对象类型的数据。
有了对象类型以后,我们就可以在数据库表中添加组合类型了。

下面我们来解决多值属性的问题。
Oracle中的表示集合类型有两个办法,一个是嵌套表,一个是Varray类型。
比如我们创建一个含有电话号码的嵌套表:
create type phone_no as table of number;
然后创建使用了嵌套表的主表。(注意嵌套表不是一个我们通常所认为的table,准确的说在Oracle数据库中它是叫table type,属于user types。)
create table stu (name varchar2(30), pn phone_no)
nested table pn store as table_of_phoneNumber;
stu表含有两个属性列,一个是通常的varchar2类型,一个是刚刚创建的phone_no类型。
向stu表中插入数据:
insert into stu values('wilmawang', phone_no(13647231280, 02761256399));
在对含有嵌套表类型的基本表查询的时候,普通的select * 的方式并不能查询到嵌套表那一个属性列的数据,要使用table函数来查询嵌套表中的数据。
select * from table(select pn from stu); 注意table函数只能处理单行的结果集,如果table中的查询结果集返回有多行记录,那么Oracle会报错:ORA-01427: single-row subquery returns more than one row。
最后我们来谈Varray类型。Varray也就是我们刚开始所说的Array Types。它与嵌套表一样可以用来存储多个值。与嵌套表不同的是,Varray的大小需要事先声明。Varray通常是做为一个整体被提取到Java等语言的数组类型中去处理。
create type pn as varray(2) of number;
create table stuv(name varchar2(20), pno pn);
insert into stuv values('WallyWong', pn(13545035202,01081438252));
关于含有Varray类型的表的查询方式和含有嵌套表类型的表一样。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值