用冗余抵御数据库结构的变化
我没做过大型项目,小型项目也才做了2个,就是分享些心法,也不知道对不对,希望大家指点。
我主要想探讨一下面向对象和关系数据库的阻抗不匹配。
数据库里各个有关系的表,其实可以合起来的,合起来就是一张表,一张很大很大的含有冗余的表。
数据库的设计就是把一张大表有冗余的数据变得不冗余,设计数据库的时候,心里要知道那张大表是什么。
如果数据库里只有一张表的话,操作起来会非常好办,因为表里的每一行,就是一个对象。
为了不冗余而把大表拆分成为几个小表,那么每个小表里的一行数据的概念就模糊了,它不是一个对象。它无法映射到面向对象里面的一个对象,面向对象是不管冗余的。
所以在程序里看到的,最好是那张有冗余的大表,而看不到那些小表,当然也不知道大表小表的关系。那么面向对象的味道就出来了,程序不去关心大表怎么拆分成小表的,那张大表就是数据库与面向对象的接口,是稳定的,接口每一行都对应着面向对象里的一个类的对象,即使大表有变化也只是增加列,而结构永远不会变化,因为程序的眼中只有一张表。
这样的缺点就是牺牲效率,数据不是很多的项目是可以用的。
面向对象天生就是以牺牲运行效率为代价而使得编码维护方便;关系数据库天生就是为了减少冗余,提高数据库的效率。两者永远会是矛盾,面向对象迁就关系数据库了,编码维护就麻烦些;关系数据库迁就面向对象,运行的效率就低些。小型项目,用牺牲运行效率来抵御变化是可以接受的;大型项目不妨牺牲人力成本来抵御变化好了。