面向对象数据库简介

面向对象数据库简介面向对象数据的定义面向对象数据库 OODB 是一个基于面向对象编程语言 OOP 的数据库 其数据都是以对象 类的形式表示并存储在面向对象数据库中 简单来讲 面向对象数据库 面向对象编程语言 关系型数据库特性 在这个公式里面 面向对象编程语言的三个特性为继承 多态 封装 而关系型数据库特性的三个特性 实体完整性 并发 查询处理 因此可用下图 1 表示面向对象数据库 关系型数据库的问题

面向对象数据的定义

面向对象数据库(OODB)是一个基于面向对象编程语言(OOP)的数据库,其数据都是以对象/类的形式表示并存储在面向对象数据库中。简单来讲,面向对象数据库 = 面向对象编程语言 + 关系型数据库特性。在这个公式里面,面向对象编程语言的三个特性为继承、多态、封装;而关系型数据库特性的三个特性:实体完整性、并发、查询处理,因此可用下图[1]表示面向对象数据库。
在这里插入图片描述

关系型数据库的问题

传统的关系型数据库存在一些约束:

  • 数据以简单的二维表形式将数据存储,每个元组的字段不可分。
  • 类型必须为内置的有限几种类型。
  • 不能用一个独立的单元表示一个复杂实体。
  • 不能定义属于某个类型的复杂处理操作。

因为以上提出的约束,在传统关系型数据中,应用程序不能直接使用SQL查询返回的结果,需要执行装箱和拆箱操作:即需要显式地将返回的字节序列转换到相应编程语言下的类型 (拆箱),当数据需要存储回数据库前 ,也需要完成上述转换的逆过程(装箱)。举个例子[2],假设在数据库中存有一个零件表格part:

create table part ( //零件关系part的schema int Pno, char(15) pname, char(10) psize, char(5) pcolor ); 

应用程序使用C语言访问pno = 16的零件,需要按照如下伪代码地形式预处理:

Define cursor P as Select * From Part Where pno = 16; //用游标读取数据库 struct Part { //应用程序访问时需定义Part类型 int number; char* name; char* bigness; char* color; } Example_part; //将打开的part表格的游标转换到Example_part类型上去 Open P into Example_part Until no-more{ Fetch P ( Example_part.number = pno, Example_name = pname, Example_part.bigness = psize, Example_part.color = pcolor); } //对访问的结果进行后续操作 

上述例子表明,由于SQL查询返回的结果独立于任何编程语言,应用程序访问SQL查询结果时必须先将结果绑定到应用程序中的自定义类型上去,随后才能对数据执行操作。并且SQL中的数据类型不能为每种实体定义相应的复杂操作,应用程序需要手动实现这些对实体数据的操作代码。此外,由于不能自定义数据类型以及封装处理数据对象的操接口, 用户必须显式地管理不同数据表格之间的关联关系,为了保证完整性需要定义主键,为复杂的数据操作和事务写相应存储过程

面向对象数据库的应用场景

一般的数据库应用程序例如银行,教务处等需要应对的数据类型结构简洁,进行数据库设计和应用程序设计时负担较小。但是对于那些不得不与复杂,特殊化的数据结构打交道的新型的数据库应用,例如卫星数据应用,CAD建模应用,多媒体数据库应用,让应用程序显式地管理数据表格之间的关联关系、定义复杂的主键、实现复杂的存储过程无疑是不现实的。在这些应用场景下,传统关系型数据库性能较差,例如实现一个最近邻查找可能都需要引入join操作。

面向对象数据库在1985年左右应运而生,主要是希望解决上述问题,他们主要以工程应用软件作为其市场[2]。当然,由于OODB缺乏数据保护、访问控制机制、查询处理和事务处理系统,大部分OODB并不将商业数据处理作为他们市场,这也是OODB数据库无法获得较高数据库市场占有率的根本原因。

面向对象数据库以对象作为存储的基本单位,多个类型相同的对象的集合成为一个类。现实世界的任一实体都被统一地模型化为一个对象,每个对象有一个唯一的标识,称为对象标识。借助持久性编程语言的底层特性,任何对象从磁盘读入内存和写回磁盘均能隐式地保证,在内存中的数据只是数据库中该对象的临时副本,应用程序可以调用属于该对象的接口,处理封装在对象内部的数据,类似C++和java那样。

面向对象数据库的优缺点

最后总结而言,面向对象数据库相比关系型数据库的优缺点如下[3]:

优势

  • 数据模型为语义数据模型,基于现实世界。
  • 对象访问不需要装箱和拆箱操作,节省编程和执行时间。
  • 更好的并发控制 – 对象的层次结构可能被锁定。
  • 在分布式架构状态下可以很好的工作。

劣势

  • 关系表更简单易懂,数据结构的存储较为简单。
  • 数据间的关系相对简单时,面向对象数据库效率较低。
  • 关系数据库有更多的工具,对事务处理,分析型数据处理任务的支持更好。
  • 关系型数据库拥有统一的标准,相应的服务和支持更加稳定。

参考文献

[1]. What is an Object-Oriented Database, https://study.com/academy/lesson/what-is-an-object-oriented-database.html 2020,2,24

[2]. Joseph M. Hellerstein and Michael Stonebraker. What Goes Around Comes Around. Readings in Database Systems, 4th Edition (2005)

[3]. 面向对象数据库,https://tson.com/object-oriented-databases-translate/ 2020,2,24

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201987.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午8:08
下一篇 2026年3月20日 上午8:08


相关推荐

  • Python ( )、[ ]、{}的区别「建议收藏」

    Python ( )、[ ]、{}的区别「建议收藏」python语言最常见的括号有三种,分别是:小括号()、中括号[]和大括号也叫做花括号{},分别用来代表不同的python基本内置数据类型。如果要创建一个字典列表,如下:

    2022年7月3日
    27
  • Struts2漏洞复现合集

    Struts2漏洞复现合集1.Struts2简介Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2是Struts的下一代产品,是在struts1和WebWork的技术基础上进行了合并的全新的Struts2框架。其全新的Struts2的体系结构与Struts1的体系结构差别巨大。Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务

    2022年7月19日
    20
  • 渲染杂谈:early-z、z-culling、hi-z、z-perpass到底是什么?

    渲染杂谈:early-z、z-culling、hi-z、z-perpass到底是什么?渲染杂谈 early z z culling hi z z perpass 到底是什么 之前一直被这几个和深度缓存 z buffer 相关的概念搞得神魂颠倒 今天在翻阅 Real TimeRenderin 时碰巧碰巧看到了这部分的讲解 硬着头皮看了看 姑且算是讲几个概念分清楚了 以我的记性估计下周就全忘了 所以打算顺手记下来 这四种技术本质上都是解决传统渲染管线中的同一个问题 过度绘制 OverDraw 一个经典的渲染管线通常会依次经历顶点阶段 光栅化 片元阶段和逐像素处理 其中片元阶段会进

    2025年10月20日
    6
  • LVS,Nginx,Haproxy三种负载均衡产品的对比[通俗易懂]

    LVS,Nginx,Haproxy三种负载均衡产品的对比[通俗易懂]本文介绍LVS,Nginx,Haproxy这三种负载均衡产品的区别。

    2022年7月24日
    9
  • 一文教你快速搞懂速度曲线规划之S形曲线(超详细+图文+推导+附件代码)

    一文教你快速搞懂速度曲线规划之S形曲线(超详细+图文+推导+附件代码)本文介绍了运动控制终的 S 曲线 通过 matlab 和 C 语言实现并进行仿真 篇幅较长 自备茶水

    2026年3月18日
    3
  • bat启动命令行_cmd打开bat文件

    bat启动命令行_cmd打开bat文件写了个win环境本地启动的java项目,又不想每次去win+R再开启powershell(win10环境)所以百度了一下bat脚本参考了大佬的文章:https://www.cnblogs.com/LiuYanYGZ/p/12078984.html只需要简单的命令就可以了:startcmd/kechoHello,World!##执行完毕以后,新开的窗…

    2026年2月20日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号