欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

敲响OO时代的丧钟——OO能从关系型数据库借鉴些什么? OOUML编程SQLORM 

程序员文章站 2022-07-12 18:34:00
...
今天这篇是关于OO VS. RDB的,OO作为一种编程范型,主要是集中于处理“操作”,而RDBMS作为一种数据管理工具,主要是集中于“数据”。但是,在一个需要数据库的系统中,必然的情况是:操作的对象自然是各种各样的数据,而数据的管理,自然要通过操作。因此,OO与RDB,从最初浅的角度来理解,虽然分别位于“业务逻辑层”与“数据层”,但是相互之间却又有着非常紧密的联系。在OO与RDB之间存在着的紧张关系,其根源在于:“OO世界中的数据是被封装的孤立数据;RDB世界中的操作是针对行集的。
 
因此,一个对象实例内部的数据,应该保存到数据库中的哪些表、哪些行、哪些列,是一个非常复杂的问题。反过来说,当我们要在内存中恢复一个对象实例时,要从多少表、多少行、多少列中采集数据,并正确转化为对象实例的内部数据,也是相当的复杂。O/R Mapping,需要考虑的问题还不止于此,在RDB中自然存在的“关系”这一概念,在OO当中,却没有明确的对应概念。在OO的世界里,对象之间存在各种各样的关系,却非常难以进行规范化的描述。再加上:“添加、修改、删除、查询”等等情况的O/R映射,以及与“关系”相关的“级联操作”——“级联添加、级联修改、级联删除、级联查询”,一个好的O/R Mapping工具,要做出来真是千难万难。
 
很多人都意识到了这一点!是的,问题的确存在。但是,为什么呢?该怎么办呢?几乎没有人会反思OO的不是,而是想当然的认为:“关系数据库技术太老了,跟不上OO技术的进步,因此,我们需要OODB这样的能够直接支持OO的数据库。”
 
“以其昏昏,使人昭昭”的事情,从来没有发生过。依着我前面的分析,在OO这样的基础薄弱的理论上,怎么可能搞出有实用价值的数据库呢?
 
在看到了徐昊的《关于面向对象设计与数据模型的精彩论述》之后,我相信自己找到了知音。他说:“OO在数据模型设计上不具有思维简洁性。”并且提出了一个重要的词汇:“边语义”!这使我相信,和我有类似想法的同志,是存在的。后来又现场听到了曹晓钢同志的《ORM时代的数据访问技术》的演讲,并且在他的笔记本里看到了他做的一些代码,居然与我的很多想法不谋而合!再加上后来与徐昊的几次MSN交流,终于使我敢于开始写这样一篇“OO丧钟”的文章,因为,我相信自己并不是孤独的反对者。
 
OO可以从关系型数据库那里借鉴些什么呢?
 
1、关系:也就是徐昊所说的边语义。在OO中,对象与对象之间是否存在关系,在对象之外是不知道的。当一个对象被封装起来以后,他内部是否使用、关联、组合了其他的对象,是不可知的。因此,我们看到的通常的OO图,只能说是Object被剖开了以后的对象图。事实上,关系是被隐藏起来的。而在RDB中,关系非常明确的被定义与标识出来,一目了然。这将带来巨大的描述效果。相比起UML Class图,E-R要容易理解得多。
 
2、Primary Key:这是RDB特有的概念,在OO中没有对应概念。因此,我们要判断两个对象是否相等,就相当困难。如果每个对象都有一个“一次设置,终身不变的Primary Key”,那么对象之间的比较语义,就能够被清楚的区分为:IS和LIKE。IS就是Primary Key相同的两个对象,他们应该完全一致,甚至在内存中,也只应该保存一份。LIKE,就是成员数据相同的两个对象,他们不是一个东西,仅仅是而已。
 
3、SQL:这也是RDB特有的语言,而在OO的世界里,查找一个对象的工作,从来没有被规范过。
 
目前就先想到这些,可能还需要再补充。
 
(未完待续)