`
jander
  • 浏览: 9320 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

一种对象存储的构想

阅读更多
现在,我们一般都用关系数据库存储对象,用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文件,以便于系统启动的时候,重新找回对象定义.

都半夜了,收工睡觉.
分享到:
评论
2 楼 zephyrleaves 2008-11-22  
如果要简单的话直接用对象型数据库好了...什么映射都没有,存的就是对象....
既然要用关系型数据库,看中的就是他的对大数据量的处理性能..你这样做的话就是去的关系型数据库的优势
1 楼 CoolinZ 2008-11-22  
这样好像不太推荐哦
在主对象加载的时候会消耗大量的性能 关联加载太多
这个方法只是方便了操作  那是用性能的损失作为代价哦

相关推荐

    人工智能、对象存储和边缘计算的兴起.pdf

    接下来,对象存储(Object Storage)作为一种新兴的存储技术,它允许数据以对象的形式存储,并包含关于该对象的元数据。与传统的块存储或文件存储相比,对象存储的优势在于易于水平扩展、管理大量数据以及处理非结构...

    数字电视业务云计算构想

    云计算是一种商业实现,源于计算科学的并行计算、分布式计算和网格计算概念。"云"作为虚拟化的计算资源池,承载各种工作负载,支持快速资源部署和任务调度,具备自我检测、监控和故障恢复能力。云计算的核心不仅在于...

    面向对象软件实践.doc

    开发者受到TodoList程序的启发,决定创建一个功能更全面的工具,包括四种不同类型的树节点:OnlyText、DetailText、OnlyFile和Folder,以满足不同类型的个人信息管理需求。 OnlyText节点是标准的树节点,只显示文本...

    通信技术专题学习网站的设计构想.pdf

    网站作为一种信息载体,具有存储容量大、表现形式多样、资源共享和实时交互的特点,为教育提供了无限可能。目前,虽然有些学校已经尝试将网络应用于教学,但多数仍局限于多媒体教学软件。真正的专题学习网站能够提供...

    UML期末复习总结.docx

    - UP是一种流行的面向对象系统的迭代式软件开发过程。 - **阶段划分**: - **初始阶段**: 构想、业务案例、范围、模糊评估。 - **细化阶段**: 已精炼的构想、核心架构的迭代实现、高风险解决、需求和范围确定。 - ...

    云计算基础相关一些资料

    云计算是一种通过互联网提供按需计算服务的模式,包括服务器、存储、数据库、网络、软件、分析能力等,用户无需直接管理和维护底层基础设施,而是以订阅或付费使用的方式获取服务。这种模式大大降低了企业和个人使用...

    AR与VR的区别

    总结来说,AR和VR分别代表了增强现实和虚拟现实,它们在技术实现和应用场景上有所区别,而BD则是一种高容量的光学存储技术,为高清内容的分发提供了可能。这三者共同推动了数字媒体和互动体验的创新与发展。

    基于GIS森林小班边界的邻接多边形数据结构.pdf

    10. 基于夹角变化趋势判断多边形搜索方向的算法:梁晓文等人提出了一种新的算法,该算法基于夹角变化趋势来判断多边形的搜索方向,这为多边形搜索算法提供了新的思路。 11. 数据结构、数据分析、大数据:文章标题中...

    云计算支持下高校网络教育平台设计.pdf

    2. 云计算的概念、特点和三层架构:云计算是一种基于网络,按需提供可调节的计算资源、存储资源和网络资源的网络架构。其特点包括降低成本、提高资源利用效率和灵活性。云计算的三层架构通常包括基础设施层、平台层...

    计算机86260计算机86260.doc

    7. 服务器:服务器是一种专为多用户服务的计算机,它们通常具有更高的性能和稳定性,用于提供网络服务。 8. 嵌入式计算机:这些计算机被嵌入到各种设备中,如冰箱中的微电脑,它们通常是专用的,不能随意修改程序。...

    voicesrepo:重新构想的语音邮件

    总的来说,voicesrepo是一个致力于改进传统语音邮件体验的Objective-C项目,它通过创新设计和重构技术,为用户提供了一种全新的、现代的沟通方式。如果你对iOS或macOS开发感兴趣,或者对重构有深入研究,这个项目会...

    15.海南三亚清水湾海景公寓概念规划2009.zip

    "shp"是Esri公司开发的Shapefile格式,是一种常见的矢量地理数据格式,用于存储地理坐标和相关的属性信息。"矢量"则表示数据是基于几何对象(如点、线、多边形)的形式,可以精确地表示地理位置和形状。 【知识详解...

    The Swift Programming Language

    Swift是一种新的编程语言,用于iOS和OS X的应用程序,建立在 最佳的C和Objective-C中,没有C的兼容性的限制。迅速 采用安全的编程模式,并增加了现代的功能,使 编程更简单,更灵活,更有趣。斯威夫特的洗涮,通过...

    主:牛:项目管理,重新构想

    "重新构想"表明该方案可能是对现有项目管理流程的一种创新性改造,可能涉及到软件设计、开发效率、协作方式或者任务跟踪等方面的重大改进。 【标签】"java project-management address-book todo-list ...

    掌握用UML进行面向对象的分析和设计:DEV475_10_Distribution.pdf

    **部署模型(Deployment Model)**是UML中描述系统硬件和软件组件如何在物理环境中配置的一种视图。它涵盖了系统运行时的物理拓扑,包括服务器、客户端、网络设备等,以及它们之间的通信关系。在描述分布时,该模型...

    从零开始:Java变量、数据类型与运算符的入门之旅

    编程是一种创造性的活动,它能够帮助我们实现心中的构想。在本篇内容中,我们将一起探索Java这一强大语言的基础概念——变量、数据类型与运算符。 #### 第一章节:变量——你的魔法储物柜 **变量**是程序设计中的...

    asterixdb:Apache AsterixDB的镜像

    资料模型一种半结构化NoSQL样式数据模型( ),该模型是通过使用对象数据库构想扩展JSON而产生的 查询语言两种表达性和声明性查询语言( 和 )支持对半结构化数据的广泛查询和分析 可扩展性并行运行时查询执行引擎...

    电子商务档案服务中的知识产权保护.docx

    1. 电子商务的核心问题是“数据信息”,知识产权法律制度是保护信息的一种法律工具。 2. 电子商务为知识产权的获得提供了一种新的途径。在电子商务的影响下,一种新的获得知识产权的途径——电子申请也已问世。 二...

Global site tag (gtag.js) - Google Analytics