热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql字段数量不确定_不定字段数目的数据库表设计和数据结构

可能采用四种技术:动态增加数据库表字段预留足够的空白字段,运行时作动态影射用xml格式保存在单字段里改列为行,用另外一个表存放定制字段现在我们来分析一下四种技术的优劣,不过首先可以

可能采用四种技术:

动态增加数据库表字段

预留足够的空白字段,运行时作动态影射

用xml格式保存在单字段里

改列为行,用另外一个表存放定制字段

现在我们来分析一下四种技术的优劣,不过首先可以排除的是第一点动态增加字段的方法,因为在实际操作时候几乎是不可能的(sqlserver太慢,oracle索性不支持),基本可以不讨论就排除。剩下后三点。

先来讨论预留空白字段的方法,基本原理就是在数据库表设计的时候加入一些多余的字段,看下面的代码:

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》CREATETABLESample(

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  namevarchar(12),

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  field0varchar(1),

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  field1varchar(1),

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  fieldNvarchar(1)

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》}

然后看实际运行时候的需要,动态分配字段给系统使用,也许需要一个这样的结构来描述分配情况:

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicclassAvailable

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》{

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicintCurrentUnusedFieldNumber;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicHashtable FieldToRealName;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》}

也许某一时刻的数据状况是这样的: CurrentUnusedFieldNumber=3, 哈西表FieldToRealName包含内容是(“field0″=”SomeId”, “field1″=”AnyName”, “field2=IsOk”)

现在的问题是如果要配合Hibernate,如何来处理?以上段的数据使用状况为例子,如果我们的类定义是这样:

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicclassEntity01

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》{

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicstringName;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicstringSomeId;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicstringAnyName;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicboolIsOk;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》}

也许只需要修改一下xxx.hbm.xml,把 SomeId 和 field0 做成对应就ok了。但是在运行时我们怎么知道会有这样的类定义?除非我们做动态代码生成,自动编译也许可以,但是问题也许就到其他方面去了;如果我们不用动态定义,那么类就只能是这样:

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicclassEntity01

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》{

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicstringName;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicHashtable ExtraFieldAndValues;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》}

使用的时候,用 entity01.ExtraFieldAndValues.setValue(“AnyName”, “boss”) 的方式来引用,也许这样是修改最少的了,但是问题是Hibernate不支持这样的方法。

再来讨论单字段存储的方法,我们使用这样的数据库表定义

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》CREATETABLESample

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》(

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  Namevarchar(12),

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  Xml CLOB(102400)//仅作说明而已

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》)

然后对应这样的类定义

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicclassEntity01

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》{

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicstringName;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicstringXml;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》publicHashtable ExtraNameAndValueFromXml;

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》}

我们的代码就可以这样使用:string id = entity01.ExtraNameAndValueFromXml.getValue(“SomeId”) 了。这样解决看起来很不错,不仅不需要Available表,而且看起来Hibernate对它的支持也很完美,但是致命的问题在于:如果保持高效的查询?除非数据库系统本身对此有支持,否则就只能用低效的substring或者like做查询,这在大批量数据中根本就不可行。

是不是折衷一下,把两种方法的优点和起来?问题有来了:怎么保持两者之间数据的同步?难道要我们用存储过程去解析xml内容?

所以,一个两难的问题,需要我们认真去解决。我们通过认真的需求分析,也许可以减少可变字段的数量,但是只要有一个可变字段或者可变的可能性存在,我们始终要去解决这个两难的问题。

期待继续讨论。

(新增部分)

还有一种方法就是改列为行,用另外一个表存放扩展字段,定义可以如下:

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》CREATETABLESampleFields

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》(

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  idSampleInteger,

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  fieldNamevarchar(30),

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》  fieldValuevarchar(100)

《mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构》)


推荐阅读
author-avatar
手机用户2602920093
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有