ORM是进化还是倒退?
一、原本没有ORM
曾经面向过程编程是主流,现在面向对象编程成了主流。面向过程跟关系型数据库天然地契合,或者说关系型数据库本来就是为面向过程编程而准备的。
图 1.1
图1.1就是面向过程编程与数据的关系。实际上早期的面向对象编程与数据的关系也是这样的,并且在现在也可以在面向对象编程中这样使用。
图 1.2
图1.2就是ORM了。相当于把程序多切了一块出来,粒度划分细了一些。
二、ORM的思想
图 2.1
ORM的思想就是通过一个规则,把数据库模型转换为对象。就和太阳光照在红玻璃得到红光差不多。
三、ORM带来了什么?
从代码处理角度来说,编程就是处理可变代码和不可变代码之间关系的一个过程。ORM带来了什么呢?ORM最大的特点是把数据对象固化到了代码中,把运行时做的事情提前到了编译期。
四、ORM是进化还是退步?
ORM是进化还是退步?
首先,程序开发,根据实践证明只维护一个版本是最优的。但是ORM实际上是对数据库结构做了一份拷贝,现在我们需要同时维护数据结构已经对象的关系结构。我认为从这点上来说,它是编程方式上的倒退。尽管现在大多ORM框架都提供了生成实体对象的工具,也就是说生成这个拷贝的过程实现了自动化。
ORM的初衷是依赖配置,但是实际上并没有完全依赖于配置,当然这个和C#与Java是静态语言有关。如果是动态语言也许会好一些,当然我并没有做过尝试,只是猜测一下。
一直以来,三层架构的思想就是改变一层的东西能不影响到另外一层。ORM通过MODEL跨越三个层,达到了这个目的。当然,如果用反射也可以不用这种跨越。跨越三个层,让三个层都对Model产生了依赖,这点我觉得也是它不好的地方。因为Model是跟随数据库变动的,不能保证改变Model不会对其它层面产生影响。而面向对象编程最基本的思想就是固化不变的东西,提出变化的东西。但是要让Model保持不变,必须要数据库不发生改变,我觉得用这个作为前提不是很理想。实际开发中数据库结构是经常变动的。也许你要说变动的时候只做加法,这样也许,当然,我只认为理论上这样是可行的。
五、没有ORM,我们还能怎么做?
那可能就是下一代数据访问的方式了。我认为面向对象编程还没有到能搞定一切的地步,现在就有很多方面显出了它的不足,所以,现在一直有新的理论出来对它进行补充。至于说面向对象的数据库,现在还需要解决至少两个问题,不说对象如何持久的问题,光是对象和数据库里对象同步就很难。比如db4o,假如对象增加一个熟悉,数据库里是无法体现的。至于将来会怎么样,将来才知道吧。