浏览 1944 次
锁定老帖子 主题:一种对象存储的构想
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-22
很烦琐啊。能不能有一种通用的对象存储机制呢?于是,就有了下面的想法。 一个对象由其类型(Class)和属性值组成。保存一个对象,就是要存储它的类型(这个简单)和它的属性。 1. 首先,建一个对象表,存储对象的ClassName和对象的id(我们要存储的对象应该都有ID). CREATE TABLE dbobject( obj_id BIGINT, obj_type VARCHAR(255), PRIMARY KEY(obj_id) ); 2. 然后,建一个属性表,用于存储对象的属性值。 CREATE TABLE dbproperty( prop_id BIGINT, prop_name VARCHAR(50), long_value BIGINT, double_value REAL, boolean_value BOOLEAN, date_value TIMESTAMP, string_value VARCHAR(255), byte_value LONGVARBINARY, obj_id BIGINT, PRIMARY KEY(prop_id), CONSTRAINT dbproperty_fk_dbobject FOREIGN KEY (obj_id) REFERENCES dbobject(obj_id) ON DELETE CASCADE ); 这样,所有只拥有简单属性的对象就可以存储了。 3. 问题来了,一个对象可不是仅仅只有简单属性,还有复杂属性和集合。这就需要建一个关系表。 CREATE TABLE dbrelation( relation_id BIGINT, relation_name VARCHAR(50), relation_type BIGINT, obj_id BIGINT, 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_id BIGINT, prop_name VARCHAR(50), long_value BIGINT, double_value REAL, boolean_value BOOLEAN, date_value TIMESTAMP, string_value VARCHAR(255), byte_value LONGVARBINARY, obj_id BIGINT, PRIMARY KEY(prop_id) ); CREATE TABLE dbrelation( relation_id BIGINT, relation_name VARCHAR(50), relation_type BIGINT, obj_id BIGINT, PRIMARY KEY(relation_id) ); ALTER TABLE dbobject add CONSTRAINT dbobject_fk_dbrelation FOREIGN KEY (relation_id) REFERENCES dbrelation(relation_id) ON DELETE CASCADE; ALTER TABLE dbproperty add CONSTRAINT dbproperty_fk_dbobject FOREIGN KEY (obj_id) REFERENCES dbobject(obj_id) ON DELETE CASCADE; ALTER TABLE dbrelation add CONSTRAINT dbrelation_fk_dbobject FOREIGN KEY (obj_id) REFERENCES dbobject(obj_id) ON DELETE CASCADE; 4.根据上面的表,建立Dao. 随便用什么工具, hibernate,ibatis, jdbcTemplate, 甚至jdbc都可以,这里只是提个想法,就不写了. 5.实现PersistService. 6.存储对象 //组装对象 Person tom=new Person("tom"); tom.setAge(11); Address address=new Address(); address.setCountry("China"); address.setCity("Shenyang"); tom.setAddress(address); Person jerry=new Person("jerry"); tom.addFriends(jerry); //存储 tom=persistService.persist(tom); //组装另一个对象 Car car=new Car("redFlag"); //存储 car=persistService.persist(car); 从上面的例句看,好像和Hibernate差不多啊.除了一点,我们不用配置对象与关系数据库的映射. PersistService 存储一个对象的时候,先从内存中检索对象的定义,如果没有就通过反射得到对象的定义,然后按照对象定义,将对象的属性保存在数据库中.对象定义可以同时保存到一个xml文件,以便于系统启动的时候,重新找回对象定义. 都半夜了,收工睡觉. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-22
这样好像不太推荐哦
在主对象加载的时候会消耗大量的性能 关联加载太多 这个方法只是方便了操作 那是用性能的损失作为代价哦 |
|
返回顶楼 | |
发表时间:2008-11-22
如果要简单的话直接用对象型数据库好了...什么映射都没有,存的就是对象....
既然要用关系型数据库,看中的就是他的对大数据量的处理性能..你这样做的话就是去的关系型数据库的优势 |
|
返回顶楼 | |