`
ray_yui
  • 浏览: 216710 次
  • 性别: 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

相关推荐

    数据库设计培训.pptx

    数据库必须存储必要的信息,支持在设计时确定的信息需求,并支持用户可能提出的实时查询。 表应当正确、有效地构造。数据库中的每个表都代表一个主题,由一些相关的字段组成,数据的冗余度尽可能小,并且在整个...

    数据库实战存储、管理和检索海量的数据数据库实战存储、管理和检索海量的数据

    在这个阶段,开发者需要分析项目需求,确定数据模型和实体关系。常用的数据库设计方法有关系数据库(如MySQLOracle)和非关系数据库(如MongoDB、Redis)。开发者需要根据数据的特性和业务需求来选择适合的数据库...

    工厂数据库管理系统.doc

    确定所有字段的名称、类型、宽度、小数位数及完整性约束 确定数据库及表的名称及其组成 确定索引文件和索引关键字 5、数据库安全及维护设计阶段 设计一个适合的数据库安全策略(用户身份认证、访问权限、视图) 为了...

    微博数据库设计

    4.1 确定数据库的存储结构 14 4.2 确定数据库的存取方法 15 5 数据库应用设计 15 5.1 数据库脚本 15 5.2 数据库完整性设计 15 5.3 数据库安全性设计 15 5.4 存储过程设计 15 6 数据库应用开发 15

    典型案例数据库设计

    1需求分析 1 1.1编写目的 1 1.2背景 1 1.2.1电子商务的发展历史 1 1.2.2乐购电子商城开发背景 2 1.3定义 2 1.4目标 3 1.5需求分析 3 1.5.1系统的功能描述 3 ...4.1确定数据库的存储结构 25 4.2确定数据库的存取方法 26

    数据库设计教案.docx

    物理设计:设计数据库的物理结构,包括选择存储结构、确定存取方法、确定数据的存放位置并选择合理的存取路径,以提高数据库访问速度及有效利用存储空间,一般由数据库系统自动完成。 四、数据库维护和管理 1、...

    数据库设计模板.docx

    4 逻辑设计 3 5 物理设计 4 5.1 表汇总 4 5.2 表[X]:[XXX表] 4 5.3 视图的设计 6 5.4 存储过程、函数及触发器的设计 6 6 安全性设计 6 6.1 防止用户直接操作数据库的方法 6 6.2 用户帐号密码的加密方法 7 6.3 角色...

    美食数据库的设计.docx

    根据用户需求,确定数据库中要保存的数据信息。对用户需求进行分析时数据库设计的第一个阶段。不断的调查与研究用户需求,了解企业运作流程等系统需求,是设计概念模型的基础。 (2)设计数据库的概念模型。概念模型...

    数据库设计-ER图.pdf

    1 数据库设计概述 数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据。 数据库设计的基本步骤: 需求分析 概念结构设计 逻辑结构设计 物理结构设计 ...

    数据库系统原理期末考试简答题.docx

    也就是说,数据在数据库中怎样存储是由数据库管理系统管理的,用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样当数据的物理存储改变时应用程序不用改变。 ②逻辑独立性是指用户的应用程序与数据库的...

    数据库设计参考模板.doc

    注释: 2.4专门指导 三、结构设计 3.1概念结构设计 3.1.1、确定实体类型 3.1.2、确定联系类型 3.1.3、确定实体及联系类型的属性(在ERD中标出) 3.1.4、根据实体类型和联系类型画出ERD。 3.2逻辑结构设计 3.3物理...

    SQL数据库设计.doc

    需求分析步骤: 1、 确认业务需求 2、 标识关系实体 3、 标识每个实体的具有的属性 4、 确认实体之间的关系 Ø 概要设计阶段:绘制E-R图 作为数据库设计者,你需要和项目组内其他成员分享你的设计思路,共同研讨...

    公交线路查询系统的数据库设计.doc

    因此,本文选用E-R图来实现数据库结构分析,公交线路查询系统数据库E- R图如图1、图2、图3所示: 图1线路属性实体 图2公交线路实体 图3管理员实体 3公交线路查询系统数据库表设计 3.1公交站台表 公交站台表负责记录...

    医院数据库设计.docx

    在选择好局部应用之后,就要对每个局部应用逐一设计出E-R图,标定局部应用中的实体、实体的属性、标识实体的码,确定实体之间的联系及其类型。在这个过程中应当遵循两条准则:(1)作为"属性",不能再具有需要描述的...

    SQLServer数据库设计.pdf

    需求分析步骤: 1、 确认业务需求 2、 标识关系实体 3、 标识每个实体的具有的属性 4、 确认实体之间的关系 Ø 概要设计阶段:绘制E-R图 作为数据库设计者,你需要和项⽬组内其他成员分享你的设计思路,共同研讨...

    公交线路查询系统的数据库设计(1).doc

    因此,本文选用E- R图来实现数据库结构分析,公交线路查询系统数据库E-R图如图1、图2、图3所示: 图1 线路属性实体 图2 公交线路实体 图3 管理员实体 3 公交线路查询系统数据库表设计 3.1 公交站台表 公交站台表负责...

    什么是数据库设计数据库设计的步骤.docx

    以扩充的实体—(E-R模型)联系模型方法为例,第一步先明确现实世界各部门所含的各种实体及其属性、实体间的联系以及对信息的制约条件等,从而给出各部门内所用信息的局部描述(在数据库中称为用户的局部视图)。...

    数据库设计说明书模板

    【说明】要确定模型设计的方式:星型、雪花,对于分析应用,可以按照主题域的方式进行实体域的设计 担保物 【说明】 1.从概要层次说明每类实体所反映的业务信息关系,说明实体域有多少实体。 2.通过PowerDesigner...

    Oracle数据库管理员技术指南

    第1章 建立和配置数据库 1.1 数据库创建规划 1.1.1 规划以及提出正确的问题 1.1.2 怎样确定恰当的数据块尺寸 1.2 组织文件系统 1.2.1 怎样命名数据库文件 1.2.2 使用最佳灵活结构 1.2.3 怎样配置符合 OFA 的 ...

Global site tag (gtag.js) - Google Analytics