在我接触这个概念的时候好像是05年,那时候有hibernate出来很流行,各个企业招聘都不在只是j2ee了还要求struts和 hibernate,我当时理解的数据库持久层就是就是数据库长链接,觉得设计的目的就是为了减少数据库服务的链接压力,当然这个理解是完全错误的。数据 库持久层设计就是ORM(Object relationship map)设计,应该是从java的实体bean中汲取过来的。我们用的数据库大多是关系数据库,建立关系的实体是数据表,所谓的orm设计就是让对象和数 据库表之间建立映射关系,让我们操作数据表就像操作对象一样简单,表与表直接的关系映射成对象于对象之间的关系。可以简单的理解为,对象和数据表之间是一 一对应的,这样设计的好处不仅仅是简单,更重要的是便于移植和维护,让程序和数据库操作分离(远离SQL)。下边我们先说说关系数据库,数据实体之间的关 系。
数据库建模的时候,比如我们用pd9.0,建立概念模型,pd会生成相应的逻辑模型和实体模型,这个也是一个比较复杂的工程,有专门的数据库建模教程,不 管是实体也好,还是概念也好,之间有4种关系:1、一对多;2、多对一;3、多对多;4、内联(这种关系很多教程和书面上都把他抛弃了,但是我个人觉得还 有必要存在),那映射出来的对象同样也是存在这样4种关系。接着说数据表的操作。
我们用Sql操作数据表的时候,有四种操作:1、select;2、insert;3、update;4、delete;这是数据表操作最小四种因子,其 他不管是多复杂的操作都是基于这四种操作的,那同样映射到我们的对象也就是有说有四个基础方法。这个时候大概有个思路,就是ORM设计就是4种关系加上4 重操作构造一个对象实体,这样理解可以说正确也可以说不正确,因为对象不存在关系这么一说,只有方法和属性。
现在讲讲为什么叫做持久层,这个持久并不是数据库资源是持久存在内存或者是cache中进行共享,而是映射的对象持久化,也就是系统只初始化一次映射关 系,以后就不再做映射,在hibernate中要配置hibernate-config.xml来映射,在上次提到的propel有专门的配置生成工具 (generator),在我自己修改后的autoCRUD也有这个工具,只是系统自己识别是不是要初始化(安装),总之一句话就是对象映射数据库表持久 化。
现在我我们心中大概有一个设计框架,下边看看我们的例子,当然是伪代码:
Class Orm_CRUD {
var $table;
var $name;
var $key;
var $fields = array();
var $required = array();
var $numeric = array();
var $indexes = array();
var $where;
var $orderby;
var $_php;
var $_parent;
var $_relationships = array();
var $_joins = array();
var $_aliases = array();
}
上边的这些属性能不能完整的描述一个数据表,表名,主键,字段,非空字段,数字类型,索引,别名,关系,已经完全可以描述一个mysql数据表,其中的 where和orderby这些属性很明显了是为统一sql准备的。数据表描述OK了,每个数据列是不是要单独映射呢?答案是必要的,下边看看我们的每个 列的属性描述:
Class Orm_ColumCRUD {
var $table;
var $name;
var $iskey;
var $isnull;
var $type;
var $size;
var $isrelationship;
var $isindexes ;
var $isunique;
var $description
}
看了这些命名我想基本上清楚了,包含列所有属性,表名,字段名,类型,长度,为空,索引,关系,唯一,描述,主键。到这里 我们属性映射的工作基本上完成了,下边就应该是数据表操作的映射了。实际上在大多数的应用下列的映射基本上是没有的,也可以不要这个环节,把他的一些重要 的属性加入table的映射中,比如主键,是不是为空,等等,像autoCRUD就是这样设计的。
我们对数据表的操作上边已经说过有四种,现在就不重复了,实际在现实情况中还有一种就是alter,修改表的属性,一般系统都不支持这样用,有两个风险, 第一数据库压力,第二就是持久层对象也需要跟着改变,在这里设计的时候我们忽略了这个问题,在设计好的数据库模型上设计ORM,这种经常alert操作在 现在比较时髦的自定义模型中用的比较多,自定义数据表字段,这个时候我们再设计ORM的时候,就应该考虑加上第五种,同时更新我们的对象映射。先就说到这 里,下篇再说方法和操作的映射。