OOP和RDBMS不匹配,谁向谁妥协,还是找个和稀泥的?

OOP和RDBMS不匹配        OOP的面向对象理论和RDBMS所基于的关系理论本来就不是一回事,理论不同,不匹配是很正常的事情,主要有以下表现:
粒度   为了概念的清晰和责任的单一,对象的设计粒度比较细。比如,一个User对象包含一个Address对象,Address里面有country, city, street等属性。但是,为了性能等方面的考虑,数据库表的设计粒度相对较粗,就上例来讲,可能有一个只有User表,地址方面的country, city和street等只作为字段。多态   多态是OO的特性,继承结构是很常见的,但是RDBMS则没有多态。标识   就Java而言,对象标识是reference,一般判断对象是否相同是用equals()方法,而数据库表中的一行的标识是主键关联   一个对象同其他对象发生关联,是通过持有其他对象的reference来表示,并且有方向,可以是单向,也可以是双向,可以一对一,一对多,多对多。RDBMS中的两个表关联是通过外键,并且只有一个方向,只能一对一或多对一,如果要多对多则需要加关系表了。        OOP和RDBMS的矛盾是在所难免的,就像两兄弟吵架,日子还是要过,我们的程序还是要写的。解决不匹配的问题,一般就下面三招:向RDBMS妥协   这是最常见的了,既然你是“关系”数据库,那我不OO了还不成吗?数据库表结构建好了,我就围绕着这些个表编程。不管是直接上SQL还是用大量只包含数据的VO,总之,面向过程。好处是,容易理解,这样程序员最好找;不足嘛,技术上和业务上的重复代码都太多,难以维护,没有审美,只有疲劳。向OOP妥协,用面向对象数据库   这个不说了,我还没见过传说中的面向对象数据库,并且在可预见的将来继续看不见。用个和稀泥的作中介,安抚两方   该OOD/OOP咱还OO,该用关系数据库咱还用,找个ORM工具让两方各得其所。这也许是最好的解决方案了,就算不能解决全部的问题,能解决九成的问题,就大大的节省了我们的时间,并且大大的提高了系统的可维护性。谁都知道,Java世界里,ORM实事上的标准是Hibernate。

时间: 2024-10-28 07:45:05

OOP和RDBMS不匹配,谁向谁妥协,还是找个和稀泥的?的相关文章

Javascript中使用exec进行正则表达式全局匹配时的注意事项_正则表达式

本文就是介绍在使用 Javascript 中使用 exec 进行正则表达式全局匹配时的注意事项. 先看一下常见的用法: 复制代码 代码如下: <script type="text/javascript"> var pattern = /http:\/\/([^\/\s]+)/; alert(pattern.exec('http://www.codebit.cn')); // http://www.codebit.cn,www.codebit.cn alert(pattern

javascript中使用exec进行正则表达式全局匹配详解

先看一下常见的用法: :  代码如下 复制代码 <script type="text/javascript"> var pattern = /http://([^/s]+)/; alert(pattern.exec('http://www.codebit.cn')); // http://www.codebit.cn,www.codebit.cn alert(pattern.exec('http://YITU.org')); // http://YITU.org,YITU.

高效匹配-经纬度快速高效定位方法,与海量经纬度进行匹配

问题描述 经纬度快速高效定位方法,与海量经纬度进行匹配 输入一个经纬度值,和全国地图经纬度值进行匹配,从而快速高效的找出此经纬度值一定范围内(20m)的最近道路. 全国地图经纬度数据量非常庞大,如何设计可最大程度的提高匹配速度.希望有高人能指点一下小弟,提供一定思路,注册不多久,就1分,都拿出来了. 解决方案 地图Api支持 定位在经度 纬度 范围的关键字搜索,或者视野范围内搜索酒店.宾馆.至于道路搜索 我估计是同理吧.

C++ string 字符串查找匹配实例代码_C 语言

在写C++程序中,总会遇到要从一个字符串中查找一小段子字符串的情况,对于在C中,我们经常用到strstr()或者strchr()这两种方法.而对于C++的string,我们往往会用到find(). C++:#inlcude<string> C: #include<string.h> find():在一个字符串中查找一个指定的单个字符或字符数组.如果找到,就返回首次匹配的开始位置:如果没有查找到匹配的内容,就返回string::npos. find_first_of():在一个目标串

正则表达式全局匹配模式(g修饰符)

正则表达式g修饰符: g修饰符用语规定正则表达式执行全局匹配,也就是在找到第一个匹配之后仍然会继续查找. 语法结构: 构造函数方式: new RegExp("regexp","g") 对象直接量方式: /regexp/g 浏览器支持: IE浏览器支持此元字符. 火狐浏览器支持此元字符. 谷歌浏览器支持此元字符. 实例代码: 实例一: var str="this is an antzone good"; var reg=/an/; console.

【原创】zip 的压缩原理与实现

无损数据压缩是一件奇妙的事情,想一想,一串任意的数据能够根据一定的规则转换成只有原来 1/2 - 1/5 长度的数据,并且能够按照相应的规则还原到原来的样子,听起来真是很酷.半年前,苦熬过初学 vc 时那段艰难的学习曲线的我,对 MFC.SDK 开始失望和不满,这些虽然不算易学,但和 DHTML 没有实质上的区别,都是调用微软提供的各种各样的函数,不需要你自己去创建一个窗口,多线程编程时,也不需要你自己去分配 CPU 时间.我也做过驱动,同样,有DDK(微软驱动开发包),当然,也有 DDK 的"

基于用户浏览记录的网页rank思路

  Google的pagerank就不多介绍了,一个能衡量网页重要程度的算法,本质上是网页相互投票的结果,基于这个特性,我们可以通过使用sitemap让搜索引擎尽可能浏览到多的网站内容,也可以通过多做外链来提高网站的PR值,达到SEO的目的. 市场上大多数搜索引擎都在使用pagerank类似的方法,且为了保证公正性,都采用纯机器运行的方式,通过网页爬虫来遍历网站,这就出现了一些有趣的问题: 1.一个网页的内容是很棒的,但是由于外链太少,爬虫在设定的深度阈值下可能无法爬到它,成为了少人问津的"暗内

ASP.NET MVC Controller激活系统详解:默认实现

Controller激活系统最终通过注册的ControllerFactory创建相应的Conroller对象,如果没有对ControllerFactory类型或者类型进行显式注册(通过调用当前ControllerBuilder的SetControllerFactory方法),默认使用的是一个DefaultControllerFactory对象,我们现在就来讨论实现在DefaultControllerFactory类型中的默认Controller激活机制. 一.Controller类型的解析 激活

阶段2:如何构建

在这一阶段,必须拿出一套设计方案,并解释其中包含的各类对象在外观上是什么样子,以及相互间是如何沟通的.此时可考虑采用一种特殊的图表工具:"统一建模语言"(UML).请到http://www.rational.com去下载一份UML规格书.作为第1阶段中的描述工具,UML也是很有帮助的.此外,还可用它在第2阶段中处理一些图表(如流程图).当然并非一定要使用UML,但它对你会很有帮助,特别是在希望描绘一张详尽的图表,让许多人在一起研究的时候.除UML外,还可选择对对象以及它们的接口进行文字