关系代数与面向对象理论

关系代数与面向对象理论
2011-04-19 12:15:54
首发于prolog小组,记录于日记备忘。
http://www.douban.com/note/146255104/

1、关系代数是一阶逻辑的子集,所体现的,就是事物之间的逻辑关系。

2、E-R模型,已经背离了关系逻辑的本意,这个E,不应该是实体,而仅仅是一个名字,关系建模不应该采用E-R图的方式。

3、一些在关系数据库上很好的设计模式,被OO分析给破坏掉了,大多数人归罪于数据库思维没有OO思维先进,实际上关系代数比OO的理论(如果说OO还有理论的话)要深刻得多。

4、采用OO思维方式下很复杂的模型,在关系数据库中会变得很简单,如果关系数据库往提供图灵完备的语言,而不是SQL的方向去发展的话,会更简单。

5、ORM是一个严重的错误,它把真实世界的关系强行用OO建模,又用ORM映射到关系数据库中,也就是说,在两个本来兼容的世界之间搭起一座与它们都不兼容的桥梁,没有比这更荒诞的事情了

数学是一种抽象学问,而抽象不只是数学,对于数据保存E.F.Codd做了大胆的数学抽象:关系代数,然后成功了,但是图论也可以,比如neo4j,软件设计从抽象的维度上我觉得可能大于数学的这个抽象边界,不然我们数学不好那就不用搞代码了。
关于ORM,Gavin King在他的书里也有说到,关系数据库是数学,OO是让我们很好的维护和扩展系统的学问,后者不是数学,所以我没有办法用数学的语言来搭建这个映射桥梁。

现在但凡访问量大一点系统,估计都没有用什么关系数据库的数学特性吧,反范式,无外键,切表,直接用key得到value.

个人观点。

组件化,是驱动OO出现的原因,组件就是一种边界东西。这个组件如何“组”法,则是OO的分析与设计。当我们冠以一个名词时,就是给定一个边界。OO为什么容易维护和扩展,原因就在边界的限定。

关系代数尽管叫数,但其实是说逻辑,别被名所迷惑。只是以数来描述逻辑而已,逻辑不是因为数而存在。OO语言也同样是描述逻辑,但OO的本意出于可维护性,可扩展性,也就是组件化,变更时不牵一发动全身,请问关系代数是否从这点作为出发点呢?若果问OO的学问是什么,我只能说OO思维(边界思维)本身就是一个学问。

世界本无边,那么对象到底是指什么呢?边界所圈出来的东西。注意我们平时所说的一个词,想到的一个东西,还有看到的、听到的都是有边界的,我们就活在组件思维当中。OO复杂,是因为现实逻辑复杂(其中很大一部分是因为不认识),例如业务。

这个问题也困扰我很久

过程似乎会更“自然”一点,这个我承认的

或者说 到底谁更“自然”或者 更有理论 这个争论在工程领域 没有太多的必要
也看到过有人把oo和wittgenstein扯在一起


鄙人觉得 大凡软件 要解决的是 如何应对不断变化的需求,楼主如果支持“过程”化的 有好的解决方案么

目前看来oo似乎要更好一点,虽然 代码 看起来 确实未必那么平铺直叙

不是回到过程化。

而是把我们平时认为的对象,用逻辑的方法正确地构造,而不是像现在这样,把内存中的数据就直接当做对象的属性。

看一个例子,苹果包含果核,同时苹果是红色的。

在流行OO中,如果苹果是一个对象,果核就是这个对象所包含的一个属性,而且,红色也会做为一个属性。

但是,实际上,“果核”和“是红色的”,完全不是一码事。

OO在这个地方就犯了严重的错误,这个错误在哲学上叫做本质主义,很低级的哲学错误,这种本质主义认为“红色”这个属性是藏在苹果这个对象中的。自从弗雷格写出《概念文字》,引入了谓词逻辑,这个本质主义的迷雾就被完全澄清了。

2011年07月10日 20:46 "@uda1341"的内容
在流行OO中,如果苹果是一个对象,果核就是这个对象所包含的一个属性,而且,红色也会做为一个属性。

但是,实际上,“果核”和“是红色的”,完全不是一码事。 ...

谁说将“果核”和“是红色的”一定放在苹果这个对象里的?根据中国老子道德经的“有欲观其缴(边界)”的边界划分原理,属性就有不同性质,红色这个属性是苹果的外部属性,因为你只有从外部才能看到它是红色的,而果核是苹果的内部属性。

属性不同还和业务场景有关,就像实体和值对象根据不同的业务场景甚至互换一样,这里面灵活性大了去了。


2011年07月10日 20:46 "@uda1341"的内容
这种本质主义认为“红色”这个属性是藏在苹果这个对象中的。 ...

为什么不把“果核”包括在内呢?无核苹果咋办呢?领域就是一切定义的前提。苹果是红色?红色只是苹果的状态。本质属性?谁说过是本质呢?OO上apple.color说的是苹果有颜色,而不是苹果就是红色:apple.red(这是啥描述,苹果的红色?)。该苹果是红色apple.color=red(以上getset看个人习惯补完)。

“红色”不是属性,是状态(值或值对象)而已,拥有者是苹果的颜色。

property is not equal to state!
[该贴被SpeedVan于2011-07-11 10:58修改过]