`
ray_yui
  • 浏览: 220185 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

数据库储存不确定实体

    博客分类:
  • Java
阅读更多

      相信在项目开发当中都曾经遇到过,有某些要储蓄到数据库当中的实体字段是不确定的,可能会动态变化,或者多个类型的字段同时存在或同时不存在,那创建数据库字段时,因为实体的字段不能确定,数据库的字段也就不能确定.

例子:
      笔者参与开发的一个招生系统当中,每个课程都有各自的入学要求,而入学要求需要被保存到数据库当中被课程引用,但入学要求的实体是不确定的,入学要求可能是面试分数大于某个数字,亦可能是是否通过4级英语,那将是一个布尔类型的字段,而在进行某个操作时需要校验该申请人是否满足他申请课程的入学要求.


     由于以上的需求,入学要求需要被保存到数据库,但数据库中没办法设立相应的字段保存所有的入学要求信息,所以项目当中我们抽象出多个入学要求的实体,将实体转换成XML的形式来保存到数据库中

public class XmlConverter {
	private XmlConverter() {}
	
	public static String toXml(Object obj) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		XMLEncoder encoder = new XMLEncoder(out);
		encoder.writeObject(obj);
		encoder.close();
		String xml = out.toString().trim();
		return xml;
	}
	
	public static Object fromXml(String xml) {
		ByteArrayInputStream in;
		try {
			in = new ByteArrayInputStream(xml.trim().getBytes("UTF-8"));
			XMLDecoder decoder = new XMLDecoder(in);
			Object obj = decoder.readObject();
			return obj;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		return null;
	}

    public static void main(String[] args) {
        Test test = new Test();
        test.setId("1");
        test.setUsername("Hello");
        test.setPassword("World");

        String xml = XmlConverter.toXml(test);
        System.out.println(xml);

        Test test1 = (Test) XmlConverter.fromXml(xml);
        System.out.println("--------id:" + test1.getId());
        System.out.println("--------name:" + test1.getUsername());
        System.out.println("--------password:" + test1.getPassword());
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_45" class="java.beans.XMLDecoder">
	<object class="com.accentrix.vtc.apm.domain.Test">
		<void property="id">
			<string>1</string>
		</void>
		<void property="password">
			<string>World</string>
		</void>
		<void property="username">
			<string>Hello</string>
		</void>
	</object>
</java>


      以上是通过toXml方法返回的xml样式,简简单单的两个方法就解决了数据库保存不确定字段的问题,如读者有更好的方法希望能指点一二,谢谢
8
3
分享到:
评论
11 楼 SSH_freshman 2014-07-09  
ray_yui 写道
SSH_freshman 写道
1.考虑将对象进行再抽象,划分为公有对象和私有对象
2.公有对象采用传统的行数据存储(即一条记录一行),私有对象采用列存储(即一条私有属性记录一行)

有考虑过,不过需求上入学要求是可以随意组合的,他们也存在一个巨大的组合入学要求,一行一条私有属性这个从效率来考虑不太可行.

效率上不存在问题,可以在业务模型设计时多做分析。
10 楼 jiekou0704 2014-07-09  
如2L所说的可以吗??
9 楼 ray_yui 2014-07-09  
mfkvfn 写道
非结构化数据不便于查询。如果只是为了保存Java对象数据到数据库中和从数据库反向得到Java对象。最简单最高效的办法是Java里的系列化和反系列化。

我尝试过jackson和gson,在转回java对象的时候并不支持BLOB类型,对基本数据类型和封装类型的支持是很好的,序列化和反序列化也有考虑过,不过考虑到需要从XML中分析客户是怎么设置的,所以使用了XML而没用序列化
8 楼 mfkvfn 2014-07-09  
非结构化数据不便于查询。如果只是为了保存Java对象数据到数据库中和从数据库反向得到Java对象。最简单最高效的办法是Java里的系列化和反系列化。
7 楼 mfkvfn 2014-07-09  
ray_yui 写道
Julysea 写道
JSON是不是会更好一些

JSON没有分数据类型,对从JSON转回来会有问题.因为入学要求有证书这个要求,是一个BLOB.

XML和JSON没有本质区别。不存在可以用XML但是不可以用JSON的场景。
6 楼 ray_yui 2014-07-09  
SSH_freshman 写道
1.考虑将对象进行再抽象,划分为公有对象和私有对象
2.公有对象采用传统的行数据存储(即一条记录一行),私有对象采用列存储(即一条私有属性记录一行)

有考虑过,不过需求上入学要求是可以随意组合的,他们也存在一个巨大的组合入学要求,一行一条私有属性这个从效率来考虑不太可行.
5 楼 ray_yui 2014-07-09  
Julysea 写道
JSON是不是会更好一些

JSON没有分数据类型,对从JSON转回来会有问题.因为入学要求有证书这个要求,是一个BLOB.
4 楼 SSH_freshman 2014-07-08  
1.考虑将对象进行再抽象,划分为公有对象和私有对象
2.公有对象采用传统的行数据存储(即一条记录一行),私有对象采用列存储(即一条私有属性记录一行)
3 楼 Julysea 2014-07-08  
JSON是不是会更好一些
2 楼 Foxswily 2014-07-08  
MongoDB挺适合这场景
1 楼 uniqueQ 2014-07-08  
还可以用流的形式存,一个是CLOB一个是BLOB

相关推荐

    数据库设计,讲解业务实体对象到数据库表的映射关系。

    在软件开发过程中,通常需要将业务实体对象映射到数据库表中,以便于存储和检索数据。这种映射关系的设计对于确保数据的一致性和准确性至关重要。 - **映射类和属性**:业务实体对象中的每个属性对应数据库表中的一...

    实体类模型构建(根据数据库自动生成实体类)

    实体类通常代表数据库中的表,是业务逻辑与数据存储之间的桥梁。在本主题中,我们将聚焦于如何使用Eclipse集成开发环境和JDK1.7来根据数据库自动生成实体类,这可以显著提高开发效率并减少手动编码的工作量。 首先...

    数据库设计--实体联系模型(E-R图)

    而"第六章_实体联系模型.ppt"可能进一步讨论了如何将E-R图转换成关系模型,这是数据库管理系统(RDBMS)能够理解的结构,这通常涉及到分解实体、属性和联系,确定主键和外键,以及规范化处理以消除数据冗余和提高...

    数据库系统基础教程_数据库基础_数据库系统_数据库pdf_

    数据库系统是计算机科学中的核心组成部分,它用于存储、管理和检索数据。本教程“数据库系统基础教程”涵盖了数据库领域的基础知识,适合初学者入门学习。这里我们将深入探讨其中的关键概念和技术。 一、数据库基础...

    数据库资料数据库的资料

    数据库是信息技术领域中不可或缺的一部分,它负责存储、管理和检索数据,是支撑现代信息系统运行的核心组件。数据库技术的发展历程悠久,从早期的层次型和网状型数据库,到关系型数据库的普及,再到如今的NoSQL...

    数据库建模 数据库建模

    概念数据模型是数据库设计的第一步,它关注的是业务实体、实体之间的关系以及它们的主要属性,而不涉及具体的数据库管理系统或表结构。通常,这个阶段会使用到如ER(实体关系)图来表示。CDM帮助我们理解业务需求,...

    数据库大作业-3D打印模型数据库系统.docx

    系统存储需求分析是为了确定数据库系统需要存储的数据量和类型,以确定合适的数据库管理系统和存储设备。例如,在3D打印模型数据库系统中,需要存储大量的3D模型数据和相关的元数据,因此需要选择适合的数据库管理...

    orcle数据库新手必备文档

    根据提供的文档内容,我们可以归纳出Oracle数据库新手必备的知识点,主要涵盖数据库规范化、数据库设计、文件组成、数据库创建步骤以及与数据相关的存储过程等方面。以下是对这些知识点的详细阐述: ### 一、数据库...

    数据库课程设计题目1.doc

    在这个题目中,学生需要根据给定的实体关系模型,设计一个数据库,包括确定实体、属性和关系,设计实体关系图,并将其转换为关系数据库管理系统。 此外,本题目还涉及到数据库 normalization 的概念,旨在消除数据...

    利用Visual Studio2010数据库实体模型建立步骤

    3. **选择存储过程**(可选):如果需要,可以选择从数据库中的表和视图生成模型,也可以选择存储过程。 4. **完成**:确认以上设置无误后,点击完成即可自动生成实体数据模型。 #### 设计实体数据模型 在上一步...

    4-软件数据库设计文档模板.docx

    在逻辑设计阶段,我们需要确定数据库的概念模型,包括实体、属性、关系等。同时,我们还需要确定数据库的逻辑模型,包括表结构、字段类型、索引等。 数据库物理设计 数据库物理设计是数据库设计的第二步骤,涉及到...

    药品存销信息管理系统数据库设计与实现(包括需求分析,数据库设计,数据表、视图、存储过程等)

    - **逻辑结构设计**:E-R图转换为关系模型,确定了各个实体对应的表结构,如药品表、员工表、客户表、员工存入药品表、客户购买药品表、入库和出库信息表等。 - **物理结构设计**:基于关系模型定义表的字段、数据...

    自己动手设计数据库

    包括确定数据类型、设置主键(Primary Key)、选择合适的索引等,保证数据的有效存储和高效访问。 六、物理设计 物理设计关注数据库在特定数据库管理系统(DBMS)上的实现,包括表空间、分区、簇、索引策略等。这一...

    数据库需求分析及作业流程图.doc

    1. 确定数据库的需求:确定应用系统的需求,包括数据的收集、存储和处理过程。 2. 数据流图设计:使用数据流图符号来描述数据流、数据存储和处理过程。 3. 实体关系图设计:使用实体关系图符号来描述数据库的逻辑...

    C#实现根据实体类自动创建数据库表

    在.NET框架中,C#是一种常用的编程语言,用于开发各种应用程序。...然而,需要注意的是,这种方法并不适用于所有情况,例如,对于大型复杂的数据库设计,可能需要更专业的数据库设计工具和更严谨的数据库管理策略。

    数据库系统工程师-数据库100问

    其次,数据库系统提供了数据独立性,使得应用程序不受数据存储方式变化的影响。再者,它提供了用户友好的接口,便于用户进行数据操作。此外,数据库系统还具有数据控制功能,包括事务管理、并发控制、数据恢复、数据...

Global site tag (gtag.js) - Google Analytics