Object RDBMS Mapping原理简介

news/2024/11/18 13:29:28/

从微软开始推出.Net Framework来对抗Java开始,其主要卖点之一就是C#是一个可以快速的进行RAD开发,它可以使用数据感知组件DataSet,OleDbConnection等组件来非常快速的开发数据库应用。通常来说,只要在界面上摆放一些数据感知组件如DataGrod,设定同数据源的连接,以及对应的表和字段,一个简单的程序就搞定了。RAD的数据库开发方式非常适合于简单的数据库应用程序开发,比如桌面型数据库应用,以及Client/Server应用的原型开发。但是对于复杂的应用程序来说,使用RAD方式开发会产生很多的问题。
  首先,使用RAD和数据感知组件,就意味数据表现层同数据库表的紧偶合,每使用一个数据感知组件,都相当于将数据的显示视图偶合到了数据库的某个表或者某个字段上,这样构建的系统的扩展和维护的能力都非常不好。


  任何对数据模型的改变都会导致对所有绑定到改动的表或字段的数据感知组件的修改, 而从数据集中读取数据,通常是根据字段名来获取字段的对象的值,如DataReader["Spell"].ToString(),该方法是以字符串来获得数据集中的字段值,这时编译器是无法帮助我们发现这种组件的绑定是否全部被修正了,即便使用的字段名称错误了,编译器仍然会认为代码没有错误,这样需要改变的组件同库表之间的绑定很难被全部发现,经常会有所遗漏,而由改动引起的错误通常只能是在运行时才能被发现,这就意味着要花更多的时间才能发现错误。而且如果测试时,错误的代码没有被测试所覆盖的话,则错误可能要到客户使用时才会被发现,这时造成的后果可能已经无法挽回了。


  而使用面向对象的数据库开发框架的话,对业务域对象的操作都是通过对象的属性或者方法来进行的,如AObj.XXX方法,对对象属性名称或者方法进行了改变的话,编译器会帮助我们找到所有对该对象的不正确的操作,这意味着可以更早地发现和解决bug。


  同时,使用数据感知组件,意味着同数据库的特有特性的紧偶合,比如为了减少代码量和提高效率,经常需要使用一些数据库平台相关的特殊sql,或者将一些复杂的sql写成平台相关的存储过程。


  另外,使用基于数据集开发的系统象基于面向对象开发的系统那样直观和容易理解。
  面向对象的数据库开发框架
  近年来, 越来越多的人认识到使用面向对象的数据库开发框架来进行大型数据库应用的开发有着很多的好处。在项目设计阶段,使用UML建模语言设计业务域对象模型,从模型出发,定义业务域对象,然后使用标准的美观的组件对业务域对象进行操作,设计某些方法将业务域对象保存到数据库,或者从数据库加载,这就是通常所说的OR Mapping,对象-关系映射问题。


  同RAD开发方式相比,面向对象的开发方式比较适合信息模型比较复杂的大型系统,同时面向对象的数据库开发框架可以很容易的实现Lazy load的延迟加载技术, 因此会产生更少的网络信息round trip,提供较好的性能。另外,框架一般都提供数据库平台无关性的支持,适合于对移植性有较高要求的开发。此外,可以将GUI同数据库解偶合,更容易扩展和维护。不过缺点是对程序员的素质要求的更高。


  一般的面向对象数据库开发框架的要求:
  对象持续性:框架必须能够以对象的方式存取数据,能存取复杂对象,如复合对象,支持对象之间的关联,比如继承,聚合,关联。


  支持对象查询:框架应该提供一种方式可以根据条件查询复合对象以及对象集合。支持标准的对象查询语言,如Object Constraint Language (OCL) 或者Object Query Language(OQL)。
  支持对象主键:大家都知道在关系型数据库中,主键可以用来唯一标识一条数据记录。面向对象的框架中也应该有一个对象主键来唯一标识一个对象。
  支持事务:创建还必须支持事务,一个交易必须是原子级别的,或者完全成功,或者完全失败,支持类似于数据库的提交和回滚操作。交易结果要求是一致的、独立于其它交易。
  支持XML:随着XML这种元数据语言的越来越广泛的应用,框架必须能从XML文件中存取对象。
  性能能够被优化: 如果面向对象框架默认产生的操作性能不高的话, 应该允许用户优化性能。
  应该支持多种应用:应该即支持桌面型应用开发,也能支持C/S和多层数据库开发以及Web开发。
  应该是数据库及数据存取API无关的:可以随时切换开发及数据库发布平台。
  应该是兼容现有的数据感知组件的:这样在使用面向对象开发框架改动已有系统时,可以保证平滑的移植。


http://www.ppmy.cn/news/51940.html

相关文章

Linux服务器后台运行代码(即关闭终端后继续运行)

目录 一、nohup 1、nohup 和 & 的区别 2、使用方法 二、screen 1、使用方法 2、其他命令 程序执行不受终端关闭或断网影响:两种方法 ① nohup;② screen 区别:使用 nohup 把程序放到后台,就再也无法切换程序到前台了…

day4-Django的model

目录 1)setting文件配置 2)理解models 3)model定义 4)常用字段类型 5)常用属性 6)数据库迁移 7)Meta类 1)setting文件配置 sqlite数据库: DATABASES {default: {ENGINE: d…

Promise的状态和方法

Promise的状态 初始状态 -> pending   初始状态可以改变   在resolve 或者 reject 调用之前都处于这个状态 最终成功状态 -> fulfilled   执行 resolve 函数,状态改变为 fulfilled   执行 onFulfilled 函数 最终失败状态 -> rejected   执行 re…

安装配置 ZLMediaKit

一、ZLMediaKit 库简介 ZLMediaKit 是一个基于 C11 的高性能运营级流媒体服务框架 官方写的项目特点: 基于 C11 开发,避免使用裸指针,代码稳定可靠,性能优越。 支持多种协议(RTSP/RTMP/HLS/HTTP-FLV/Websocket-FLV/GB28181/MP4…

Android性能优化—ViewPagers + Fragment缓存优化

大家看标题,可能会有点儿懵,什么是ViewPagers,因为在很久之前,我们使用的都是ViewPager,但是现在更多的是在用ViewPager2,因此用ViewPagers(ViewPager、ViewPager2)来代替两者&#…

mysql常用规范

常用规范总结 表、存储过程、视图要有统一的命名规范,例如:表以t_打头,存储过程以sp_打头,视图以v_打头; 数据库和表的字符集用UTF8,如有emoji表情包的需求,必须使用UTF8MB4。 数字类型不要用…

Linux: 进程间通信机制

文章目录 1. 前言2. 进程间通信机制2.1 管道2.1.1 匿名管道2.1.2 popen() 和 pclose()2.1.3 命名管道 FIFO 2.2 消息队列2.3 共享内存2.4 信号量2.5 网络套接字2.6 UNIX套接字2.7 信号 3. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给…

京东商品列表数据采集(APP,H5端)

采集场景: 在京东搜索页 https://search.jd.com/Search 输入搜索,搜出后得到的多个商品列表数据。 征地: 商品名称、价格、评论数、店铺名称、店铺链接等字段。 采集结果: 采集结果可导出为Excel,CSV,HTML,数据库等格式。导出…