to SportsBaby1980:

首先说明一点,就是复杂性,在复杂性上,我一般习惯分为实现复杂性和思维复杂性,有的问题我们可以很容易的想到解,但是并不意味他是容易实现的,比如递归下降的词法分析(以及大多数递归求解算法),具有极强的思维简洁性,但是往往具有难以想象的实现复杂度。同样,我们还有两种就是对人简单和对机器简单,对机器简单的必要条件就是可形式化为递归能行求解过程(依据图灵机原理)。ok,从这样两个复杂纬度我们来分析一下oo和er在 数据表述(请注意,我仅仅说的是数据表述,也就是一个系统的静态纬度)上的复杂度。
关系模型: 关系模型的数据模型集合以及在集合基础上发展出来的关系操作语义关系运算。那么很显然对于一个有数学(离散,集合论)基础的人而言,关系模型具有思维简洁性。对于计算机而言,关系运算在有限集上是递归能行的,所以对于计算机而言,关系模型具有计算简洁性
对象模型: 对象模型的数据模型,非常抱歉,虽然本人从94年起就开始接触OOA&D以及做相关的工作,也算个狂热的OO分子,但我不得不说,从计算机科学的角度来说,OO的数据模型未定义!但是往往大家都同意一个观点,就是用networked model或者graph model可以很好的描述oo的数据模型,因此为了讨论的方便,我们可以不严格的认为OO的数据模型是Graph Model。那么再看一下OO数据模型的操作语义,显然可以推出为图操作(基于路径)。那么我想请问一下,你在思考一个模型的时候,是集合简洁还是Graph简洁?我敢说这样的话,国内做计算机的,至少90%对图论是懵懂的,当然我也是(在下十岁起学习算法设计参加NOI/IOI竞赛的,当时主要的算法设计就是图算法,最好名次北京市第六名,也曾深入学习过离散和图论,不过仍然懵懂)更不要说用使用图来思考对象语义了。当然,这个结论有违常识,因为你会认为
Person p;
p.getName();
是很简洁的也是很好理解的,那么如你所说“请不要拿一个人能完成的小系统来作例子”,那么我们来说一下,复杂的对象系统,你怎么判定一个系统是好的?我想你会列出很多依据,不过我猜那些结论多是经验性的。对吧?比如bad smell。
那么你可曾考虑过使用图模型分析很多对象间复杂关系的设计合理性?你可曾考虑过在domain model里,使用pattern之后图模型路径的变化?你可曾想过使用图模型来改善对象的静态设计?
如果你考虑过,你就会有这样的经验,OO在数据模型设计上不具有思维简洁性。因为我们不能follow一套递归过程,之后证明我们的设计就是合理的!!!而关系模型可以,就是范式。依据范式简化,我们可以说我的关系设计是无冗余的,是如何的,但是对象模型你就无能为力了。
我可以以我的经验告诉你,对象模型的优劣和一个对象图上的生成树,环的个数以及通度有关。但是具体关系,sorry,然后是未知的。我马上要在oo上进行的一个研究,就是分析各种OOA&D流派对对象图的改变,以及在图中引入的边语义。哎这个说的有点跑题。
我们会过来看OO的计算机处理,非常不幸,在包含环的Graph Model上的运算,虽然是递归可解的,但是费用相当的高。因此可以说OO不具有计算简洁性

那么OO不具有思维简洁性不具有计算简洁性,他为什么能如此成功?因为它符合冯诺依曼原理,控制流主导,也就是通由对象的行为,指引数据的传递。也就是为什么职责,协作在OO中格外重要的原意。因为他们是刻画控制流的。

因此我的论点是,在数据模型上,OO并不占有优势。

而你所讲的问题,是数据库在流程和运算上的缺陷。但是你用的题目是OO的关系比数据关系简单,等于你用了数据视角的论点但用了动态视角的论据。mismatch!

另外,可以考虑一下在消息或者服务驱动的分布式系统中,比如SOA,数据是XML描述的,why?其一是交互性,其二是因为消息扮演了控制流的角色,OO对象已经没有用处了,用它来传递数据,并不能发挥他的作用。

最后,上述所有内容,讨论的是计算机科学范畴,不是计算机应用范畴。跟语言和java,j2ee没有任何的关系。本来深刻认识OO不足是研究OO理解OO的必然过程,但是在初学者眼中会引起恐慌。banq的论坛这里初学者很多,我对可能会产生的恐慌表示道歉。所以如果banq认为不必在这个论坛探讨,删掉就好了。

to SportsBaby1980:

刚才忘了说业务过程那块。这里我想问一个问题,什么计算机?

Computer = Operator(DataModel)

这是一般性表述,就是特定数据模型上的预算。到硬件级,我们可以写:

C = O(d) d = {0,1} O = {store,load}

那么数据库呢?

Cdb = Odb(ER) Odb= {store,query,remove}

这是什么?这是数据操作元语,我们写的信息系统

Cmis = Omis(Dmis)

基于数据库的应用,程序员的工作就是Omis->Odb影射,Dmis->ER影射。

换而言之,当你有一个业务逻辑A,你要做的工作,就是得到一个运算序,BusA -> Op(数学计算), Odb, Odb, Odb...

那么数据库的作用很明显,和三级管与非门是一样的,基础元语。不能描述业务是很正常的,你会希望一个与非门完成复杂的四则运算吗?不会,那么你希望数据库完成业务吗?不会,而且也不该是他的责任(Store Produce类似硬件实现一个逻辑)。
所以数据库不能表示业务,是天生的!!不用任何讨论。这个类似软硬件逻辑等价,我们暂且称之为信息系统中OO与数据库的逻辑等价。实现在哪一端是你应用选择的结果。so over。

很感谢发给偶mail的这位朋友精彩的分析与回复,如您所说,偶也是众多apprentice的一员,也非常非常的不希望失去Omis-->Odb,Dmis-->ER之类的工作,也很赞赏您写了很多的文字这种付出的精神,更加的同意将软件的设计与硬件从某种角度联系起来,就算是将来的aop作到了如今vlsi的成绩,偶相信rdbms依旧是要在中间层的后面发挥着强有力的作用的。换了其他形式的后台也同样,三层结构如同足球场上的前中后场一样,谁也离不开谁的,至于如何设计组合一个理想的系统或是球队的话,要看各自教练的思想和水平了,并没有什么一定之规了,偶赞同一位前人说的,计算机乃是一门艺术,无论是从冯的角度考虑或是图灵的假设来演绎,艺术本就是无边界的,所以编程也不应该有唯一的解,呵呵,偶还是保守的两边都支持吧,设计软件系统最好结合数据库的优化来考虑,如同实施系统的时候要结合网络结构来考虑是同一个道理的,既然软件是一个有机的整体组合,那可能最好的做法就是瞻前顾后才能不顾此失彼吧。

呵呵,胡说的,没什么论据支持,但是偶自认为该努力的方向.也许以oo为先导设计系统比较的适合新立的项目,甚至没什么历史数据的包袱,而数据库领衔的或许更适用于那些已经有大量数据积累,不必改弦更张的令行设计表结构什么的应用吧。

to raimundo:
看到你的意见,我很高兴。
让我认识到我的无知,也是我学习的机会。

OO在数据模型设计上不具有思维简洁性。因为我们不能follow一套递归过程
这段我不是很明白你的意思?
可以详细解释吗?


那么OO不具有思维简洁性不具有计算简洁性,他为什么能如此成功?
因为它符合冯诺依曼原理,控制流主导,也就是通由对象的行为,指引数据的传递。也就是为什么职责,
协作在OO中格外重要的原意。因为他们是刻画控制流的。

对于OO为什么成功,我觉得这个和你说原因有点出入。
技术的出现,不能从其本身来看。
OO符合人类社会的模式,而且目前这个在社会中还是主流。
另外,SOA的结构也是类似原因----仅oo达不到目的,OO关注过多的细节,交互麻烦,所以有Service的概念。



shuiwx 拿足球来讲,是个很好的启发。

三层结构,各层不可缺少,但并不是不可替换。
比如,今天,后卫有点问题,教练让其他的人上。
就好像数据库在这个情况不适用,使用文件系统。

raimundo,我觉得数据库和OO不冲突。
因为他们角色不一样。好像篮球场上,中锋不能替代后卫,同样后卫不能替代中锋。
但以数据库为中心的设计和以OO为中心的设计,他们就有点冲突了,好像姚明和奥尼尔一样,同样位置的.

数据库,处理数据的存储,
OO作为整个体系的设计指导,
OO是设计思想,数据库书存储方式,他们各司其职.

对于目前的情况来讲,OO和数据库是相辅相成的----一般系统都离不开数据库(所以本帖子的标题有点不是很正确).而具体如何把Object存到数据库,那是具体技术---------这就具有选择性了.java可以这样做(不仅仅hibernate,ejb,jdo,jdbc也一样),C#一样,甚至Delphi也行,连VB都可以----可能某些具体技术要自己花时间来实现存储策略.

在理解这些问题上,我可能没你站的角度高,也或因为我本身局限性.

在Object到数据库表,始终有个问题,他们描述或处理事物的角度或方式不一样,所有产生了不匹配性.
而具体的O/R mapping技术则是解决这个不匹配性,让我们不用关心具体细节.

如果我们自己是实现O/R mapping,我们可能要为每个Entity Object都写个存储方案或要为每个都调用存储方案.而那些O/R mapping正是在这些基础上作出来.因为多次的重复,所以抽象出来其共同的东西,形成一个思想或技术或框架-------这是很多framework出现的原因或动力.这些也再次说明一个问题,人们喜欢简单.

关于数据库为中心的设计,了解一些,不是很深入,但我被OO的设计方式所吸引,因为OO更符合我或者说更符合我们人的思维方式----因为我们每天做的事情都符合OO概念(不是设计或写程序).

我的结论:
OO和数据库是可以共存,目前是相辅相成,没有冲突.
OO为中心的设计和数据库为中心的设计,是有冲突.

请对数据库为中心设计和OO为中心的设计都掌握有深度的发表一下看法.

sportsbb果然是个体育迷啊,也是个对技术执着的朋友,good.

OO在数据模型设计上不具有思维简洁性。因为我们不能follow一套递归过程好象大概的意思是穆里尼奥可以用借他的笔记本和足球专业分析软件来辅助甚至指导蓝军的多数队员的训练和生活,但是他不能完全的依赖于此,没有了其自身的指挥才能与灵感的介入,阿布就别指望他能获得那么多惊人的成绩,不是说协作为本么,偶觉得多数用例中都少不了人为的介入来动态的完成协作流程也是此理,抛开决策点这个因素偶觉得似乎到可以有以递归形式来解释并实现用例的可能,但似乎这不太可能,如同老穆的临场指挥一样,福格森都不一定看的明白,何况愚蠢的计算机呢。r老师,或许偶曲解了你的意思,莫怪啊,偶已经菜的不可救药了。

控制流主导,也就是通由对象的行为,指引数据的传递。也就是为什么职责,偶觉得似乎是相对数据库来说的,表空间里似乎连象样的数据因果关系都难以体现,更别期待什么数据流与控制流了,这也似乎是当初为什么发明高级语言的一个原因吧。至于人类活动的最近似模拟,偶觉得倒是aop之流似乎会更贴切些,偶赞同生活是中存在着若干的object,但假如从human being的行为角度来看,懒惰的偶更希望把每时每刻的生活抽象为对某个问题的解答,而不是对某些对象的操作,毕竟大多数人类不是小孩子,对所有事物都要象学习外语单词那样去先感知后使用,大多数人是在自身的思维指导下完成每日的生活“程序”的,而偶自己觉得更多的是在经历“遇到了什么问题,该如何解决,对之后的生活有什么影响”之类的过程,并不太在意今天面前摆放的是一本书还是一部跑车,所以偶赞同这个世界物质存在的同时,更加的希望是人类的思维为主导,也许是偶不够注重细节,但自觉得这似乎由aop来辅助实现更接近一些,以object为主来考虑问题如你所说,太琐碎了,偶的大脑没有smp的能力,所以它更加的适合作为系统应用大厦的砖瓦,而不要拿来做主体结构设计的模块。但aop偶觉得还有可发展的空间,所以先暂且混迹在oo的队伍里吧。

就您呼吁的两栖高手前来传授经验的想法,甚是赞同,假如开发是并行化的,那是否有人会着手从中场和后场同时来开始设计一个系统应用呢?如果有这样的试验,那么在位置冲突时该如何解决矛盾的存在以避免资源的浪费和最大化整体的运行效率?但偶觉得这似乎有点子力重复了,既然谁也离不开谁,不如索性让两者都有主导的机会吧,,不是都说中场强大的队伍都很厉害么,所以假如oo为先导,用例转化为类图之后将表结构确定,这是一类打法,用以对付新的应用系统;假如后场能力具备的时候,即多弄些rowset wraper之类的object,再把球传到前面去,这是另一类打法,或许可以对付那些以具备旧的数据存储方案和历史数据的系统升级与功能扩充,这样大家都能继续存在和发展下去,不是挺好的?

哎,看来我还是有好多东西没说明白。目前的计算机体系结构,产生于四个基本理论,也受制于四个基本理论:

1. 逐步求精算法。
2. 集合论
3. 图灵理论
4. 冯诺依曼结构

其中前俩个我就不说了,图灵理论也叫图灵机,是计算机的理论原型,这个大家也知道,图灵理论说,数学上有解得问题一定是图灵机可计算的。或一种更数学的说法,数学可解的问题一定是递归问题。因此计算机科学非常看重低归过程。认为算法的基本构造原理一定是递归构造。程序设计的基本过程,一定在构造递归算法。
至于程序构造的递归过程和这个问题有关,就是“能不能用计算机自动对程序进行优化”。答案是,依据图灵理论,如果程序的构造优化的过程是递归,那么就可以自动化完成优化过程。典型的例子,就是将一段非结构化程序结构化,这就是一个递归过程。
递归过程除了具有计算机可解性外,还具有一种思维简洁性,因为我们不用做太多的思考,只用跟随一个过程,就可以完成。比如我们手动将表设计优化到三范式,就是一个递归过程。在此过程中,我们有明确的目标,就是低冗余,有明确的终止条件,就是符合三范式定义。
我说OO设计不具有递归过程就是这样的一个推论。目前,尚没有一个理论,可以完整提供一个递归过程,证明依据这个过程构造的对象体系就是合理有效的。pattern是一种尝试,但远远不够。

冯诺依曼原理给我的指导是什么呢?我想大家都有这样一个共识,就是软件结构一定要符合硬件结构。就算把jvm想象成抽象硬件可能这个命题依然成立。既然计算机的硬件结构依从冯诺依曼原理,软件也应该参照。就是软件应该立意于计算,但是计算之前要规划好存储。

至于说OO和数据中心那个好,我遗憾的告诉你,以我的经验,系统scale越大,oo在系统结构中的地位就越不重要,oo就越倾向于实现层次,而非架构。你看soa,根本不用考虑你的实现方式。虽然soa本身是oo的延续,但他也是oo主导体系结构的终结。实际上明白这一点,这可以很容易的明白为什么很多oo大师都不推荐分布的实体对象,比如ejb 1.x中的entity bean。就是因为large scale结构中的oo实效。

这个问题我已经在着手准备一片专门的论述。
至于AOP,我想这又是另外一个论题,我在程序员 第5期上发了一篇AOP的原理论,兄台可以看一下。

在没有成熟的成果出来之前,这种事是说不清楚的,你从各个不同的角度来看,都会有不同的说法。说来说去都是套用那些现成的理论。还不如去做点实事。这么好的理论水平,这么多的时间,去搞些见的了人的open source出来,中国号称几百万程序员?,网上说的出来的open source有几个made in china?反正老子这种小公司普通代码工还要为生计着想,是没有那么多时间搞不要钱的东西。不过看来诸位都是些“白磷”,应该有时间的吧。
TSS最新访谈录:《J2EE 最佳实践》作者Darren Broemmer谈话中也有提出“尽量少访问数据库”的理论,网址:
http://www.jdon.com/jive/thread.jsp?forum=16&thread=20464

如果对该论题还有疑问的,建议下载他的书籍看看,其中有电子版本。

至于说OO和数据中心那个好,我遗憾的告诉你,以我的经验,系统scale越大,oo在系统结构中的地位就越不重要,oo就越倾向于实现层次,而非架构。你看soa,根本不用考虑你的实现方式。虽然soa本身是oo的延续,但他也是oo主导体系结构的终结。


不懂上面说的什么东东。oo是一种方法论,怎么"在系统结构中的地位就越不重要"?作者是不是要说的是“系统scale越大就越不能用oo?".
另外,说soa究竟是什么?soa究竟是不是oo?(我的看法,soa傻都不是,只不过又一个marketing的名词而已,似乎不要扯到oo上来。)
另外,除了作者的经验,其他是不是还有什么reference可以证明这一点?

我不赞同把一些硬件的理论套在软件上,当然你可以说我是孤陋寡闻(请介绍些这样的reference我可以参照一下,谢谢)

冯诺依曼原理给我的指导是什么呢?我想大家都有这样一个共识,就是软件结构一定要符合硬件结构。就算把jvm想象成抽象硬件可能这个命题依然成立。既然计算机的硬件结构依从冯诺依曼原理,软件也应该参照。就是软件应该立意于计算,但是计算之前要规划好存储。


我还真不知道这个共识(惭愧惭愧)。而且,这句话我也根本不明白是什么意思。“就是软件结构一定要符合硬件结构”?能不能说的再明白点。(什么硬件结构?什么是软件结构?为什么要符合?)另外,我个人认为这是个很有颠覆性的论断,以前有人说过吗?(不知道,请指教)
>TSS最新访谈录:《J2EE 最佳实践》作者Darren Broemmer谈话中也有提出“尽量少访问数据库”的理论,网址

这本书好早之前就看过了,avoid database hits是为了I/O的效率吧...跟体系设计没什么关系了。

在SOA里,你可以把一台部署了服务的机器当作一个OO instance来看待,这时候service是方法的等价物,随service传递的数据,是OO对象数据的等价物。因此SOA可以看作large scale的OO应用。在这个粒度通过domain类对象组织数据是不太合适的,返而给定一种数据结构来表达数据是合理的。类似的例子,IBM和BEA倡导的SDO规范,就是为了SOA架构下数据传递所确立的,核心思想就是通过graph model组织和传递数据。
“在计算技术领域中,算法是核心,体系结构是执行算法的环境,软件是将算法影射到体系结构的桥梁,刻画了三者之间的关系,这是了解,把握计算技术最重要的基本概念”
这句话不是我说的,是一位参与了我国第一台计算研发的老教授说的。这个是一个很有名的模型,叫哑铃模型。软件位于算法和计算机体系结构之间,编译器、虚拟机类软件是绝佳的体现。同时这个模型也可以应用于软件体系结构。
我还以为没有人接着讨论了!

raimundo的言论还那么精辟和渊博!
flyinair2000 的发言也很精彩!

bang老师谈谈你的看法撒!

――――――――――――――――――
非常感谢各位前辈,在这里真的学到很多!