数据库和OO

都说数据库对OO有阻碍作用,关系型数据库不是也能体现出对象之间的关系吗?外键代表单向,中间再放个关联表,不就代表双向关联了吗、对象之间不也就这几种关系吗?继承除外啊。

1, 粒度问题(对象有聚合,组合,子对象,而关系只有行和列两种粒度)

2, 子类型问题(关系模型没有继承策略)

3, 同一性问题(对象的比较有地址比较和值比较,而数据库呢?同一个行可以对应多个恒等对象,equls问题。

4, 关联相关问题(对象关联有一对一,一对多,多对多,但是数据库只用通过外键表达的一对一和一对多,而且没有方向)

5, 数据导航问题(关系数据我们可以通过定制sql来导航,而对象导航是渐进的,可怕的n+1问题就在这里),数据库的导航外键如果再查询里不指定就不起作用,对象则不同。

可见my bloghttp://oojdon.iteye.com/blog/901578
[该贴被oojdon于2011-04-20 15:54修改过]

我再从功用方面谈谈:
关键是边界问题,对象关系有多种不同边界可供选择,如领域边界,聚合边界,实体对象边界。
就象洋葱皮一样,一层层,非常丰富可供选择,而数据库要么是1,如外键,要么是0,要么没有。

其次,有边界有封装,可以防止两个数据表数据操作不一致。

表达“关系”的工具越丰富越好,比如现在SNS社交网络微博表达人之间关系,还处于数据表关系阶段,要么是被关注,要么不关注,人自己关系还有家人关系 隐秘关系 朋友关系 生意关系,公众粉丝关系,这些丰富关系都需要在微博或SNS中可方便表达出来。

为人服务的工具越丰富,人的可选择范围越多,才真正促进人类发展,人类文明不应该受限于一两种工具。
[该贴被banq于2011-04-20 17:10修改过]

哦 懂了 感谢两位的回答
上午我这面的网不好 没回复上。

OO中难以表达的关系,用关系数据库都可以表达出来。

2011年04月23日 22:23 "@uda1341"的内容
OO中难以表达的关系,用关系数据库都可以表达出来 ...

计算机最终只认0和1两个数字,那我们是不是要提倡回到只有0和1编程的“混沌”时代?
OO的出现为我们大家提供了一种直接对客观世界中的问题进行分析、设计、建模、编程、测试等一篮子解决方案。OO软件模型可以做到相对稳定,软件各方参与者更容易理解这个统一的软件模型。而这一点,随着软件需要解决的问题越发复杂,变成一个软件开发团队采用OO技术的重要因素。
数据库模型的一个很大问题是:它随着开发进度的深入,模型修改也非常频繁,以致软件参与者很难获得稳定的、统一的数据库模型。另外,这种模型所能包含的寓意实在是丰富,以至于,不要说软件参与者交流困难,即便程序员和程序员交流都很困难。OO是采用了抽象,螺旋式迭代等方法解决了第一个问题,而第二个问题对于OO不是什么大问题。如果关系数据库模型能解决以上两个重大问题,那么,OO的意义也就不大了。

以上是软件工程角度分析,其实还可以再深入探寻原因。
数据库只关注数据,而这些数据最终代表的实际意义很模糊,谁都能引用、加工、修改。而客观世界中的问题不光是数据上的问题,可能还有更重要的行为没有体现。数据库模型是不涉及体现行为的。这成了数据库模型的天生短板,程序员将行为代码单独分离编写。所以,数据库模型中的内容搭载的是“直通车”,任何代码可以直接“抵达”(引用、加工、处理)。所以,可以这么说,正是数据库模型可以具有太多的含义,以至于谁都可以引用、加工、处理。这就造成这种太多“含义”,变成毫无意义,也同时造成数据库模型的不统一、善变性。

关系数据库来源于关系代数,关系代数来源于一阶逻辑,一阶逻辑来源于弗雷格的《概念文字》,逻辑来源于古希腊的伟大传统。

OO来源于一个计算机科学家贫乏的哲学思考,OO和现实世界是不兼容的。

可悲的是软件业走了这么长时间的弯路。

又是一句我爸是李刚。

若果你想否定OO,那么先证明边界是不存在的。若果边界不存在,那么一切语言描述客观都是错误的,那样的话,软件能够存在么?一旦定义了某样东西,该东西的边界自然生成。为什么人类能辨识,也只因边界存在而已,如人类定义车,那么看见车后,绝不会想那是乌龟,为什么能够区别车和乌龟?只因边界而已。没有边界就如混沌,李刚还是李刚么?呵呵,其实你说的每一句话,你想的每一个思想,已经存在边界了(各种定义),只是你不承认罢了。