一种对象存储的构想
现在,我们一般都用关系数据库存储对象,用Hibernate或者ibatis将我们的对象与关系数据库中的表对应起来。也就是说,每次设计都需要进行对象到关系数据库的映射配置。
很烦琐啊。能不能有一种通用的对象存储机制呢?于是,就有了下面的想法。
一个对象由其类型(Class)和属性值组成。保存一个对象,就是要存储它的类型(这个简单)和它的属性。
1. 首先,建一个对象表,存储对象的ClassName和对象的id(我们要存储的对象应该都有ID).
CREATE TABLE dbobject(obj_id BIGINT,obj_type VARCHAR(255),PRIMARY KEY(obj_id));
2. 然后,建一个属性表,用于存储对象的属性值。
CREATE TABLE dbproperty(prop_idBIGINT,prop_nameVARCHAR(50),long_valueBIGINT,double_valueREAL,boolean_valueBOOLEAN,date_valueTIMESTAMP,string_valueVARCHAR(255),byte_valueLONGVARBINARY,obj_idBIGINT,PRIMARY KEY(prop_id),CONSTRAINT dbproperty_fk_dbobject FOREIGN KEY (obj_id) REFERENCES dbobject(obj_id) ON DELETE CASCADE);
这样,所有只拥有简单属性的对象就可以存储了。
3. 问题来了,一个对象可不是仅仅只有简单属性,还有复杂属性和集合。这就需要建一个关系表。
CREATE TABLE dbrelation(relation_idBIGINT,relation_nameVARCHAR(50),relation_typeBIGINT,obj_idBIGINT,PRIMARY KEY(relation_id),CONSTRAINT dbrelation_fk_dbobject FOREIGN KEY (obj_id) REFERENCES dbobject(obj_id) ON DELETE CASCADE);
将对象表改成下面这个样子:
CREATE TABLE dbobject(obj_id BIGINT,obj_type VARCHAR(255),relation_id BIGINT,PRIMARY KEY(obj_id),CONSTRAINT dbobject_fk_dbrelation FOREIGN KEY (relation_id) REFERENCES dbrelation(relation_id) ON DELETE CASCADE);
这样,一个对象可以有多个关系,一个关系可以有多个对象。
对象间的关系可以定义如下:
ObjectRelationType.one
ObjectRelationType.list
ObjectRelationType.set
ObjectRelationType.map (map类型的key,对应dbobject表中的obj_name)
好了,成功解决对象复杂属性和集合属性。
最终表结构如下:
CREATE TABLE dbobject(obj_id BIGINT,obj_type VARCHAR(255),relation_id BIGINT,PRIMARY KEY(obj_id));CREATE TABLE dbproperty(prop_idBIGINT,prop_nameVARCHAR(50),long_valueBIG啊.除了一点,我们不用配置对象与关系数据库的映射.
PersistService 存储一个对象的时候,先从内存中检索对象的定义,如果没有就通过反射得到对象的定义,然后按照对象定义,将对象的属性保存在数据库中.对象定义可以同时保存到一个xml文件,以便于系统启动的时候,重新找回对象定义.
都半夜了,收工睡觉. 1 楼 CoolinZ 2008-11-22 这样好像不太推荐哦
在主对象加载的时候会消耗大量的性能 关联加载太多
这个方法只是方便了操作 那是用性能的损失作为代价哦
2 楼 zephyrleaves 2008-11-22 如果要简单的话直接用对象型数据库好了...什么映射都没有,存的就是对象....
既然要用关系型数据库,看中的就是他的对大数据量的处理性能..你这样做的话就是去的关系型数据库的优势