论坛首页 Java企业应用论坛

一种对象存储的构想

浏览 1944 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-22  
现在,我们一般都用关系数据库存储对象,用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_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文件,以便于系统启动的时候,重新找回对象定义.

都半夜了,收工睡觉.
   发表时间:2008-11-22  
这样好像不太推荐哦
在主对象加载的时候会消耗大量的性能 关联加载太多
这个方法只是方便了操作  那是用性能的损失作为代价哦
0 请登录后投票
   发表时间:2008-11-22  
如果要简单的话直接用对象型数据库好了...什么映射都没有,存的就是对象....
既然要用关系型数据库,看中的就是他的对大数据量的处理性能..你这样做的话就是去的关系型数据库的优势
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics