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

本文探讨了处理不确定字段数量的数据库表设计方法,包括预留字段、XML存储和字段转行存储等策略,并分析了各自的优缺点。在实际应用中,如配合Hibernate,这些方法会带来额外的挑战,例如动态代码生成、数据同步和查询效率问题。通过需求分析和权衡,可以找到适合特定场景的解决方案。
摘要由CSDN通过智能技术生成

可能采用四种技术:

动态增加数据库表字段

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

用xml格式保存在单字段里

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

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

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

None.gifCREATETABLESample(

None.gif  namevarchar(12),

None.gif  

dot.gif

None.gif  field0varchar(1),

None.gif  field1varchar(1),

None.gif  

dot.gif

None.gif  fieldNvarchar(1)

None.gif}

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

None.gifpublicclassAvailable

ExpandedBlockStart.gif

ContractedBlock.gifdot.gif{

InBlock.gifpublicintCurrentUnusedFieldNumber;

InBlock.gifpublicHashtable FieldToRealName;

ExpandedBlockEnd.gif}

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

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

None.gifpublicclassEntity01

ExpandedBlockStart.gif

ContractedBlock.gifdot.gif{

InBlock.gifpublicstringName;

InBlock.gifpublicstringSomeId;

InBlock.gifpublicstringAnyName;

InBlock.gifpublicboolIsOk;

ExpandedBlockEnd.gif}

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

None.gifpublicclassEntity01

ExpandedBlockStart.gif

ContractedBlock.gifdot.gif{

InBlock.gifpublicstringName;

InBlock.gifpublicHashtable ExtraFieldAndValues;

ExpandedBlockEnd.gif}

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

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

None.gifCREATETABLESample

None.gif(

None.gif  Namevarchar(12),

None.gif  Xml CLOB(102400)//仅作说明而已

None.gif)

然后对应这样的类定义

None.gifpublicclassEntity01

ExpandedBlockStart.gif

ContractedBlock.gifdot.gif{

InBlock.gifpublicstringName;

InBlock.gifpublicstringXml;

InBlock.gif

InBlock.gifpublicHashtable ExtraNameAndValueFromXml;

ExpandedBlockEnd.gif}

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

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

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

期待继续讨论。

(新增部分)

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

1143164O1-47.gifCREATETABLESampleFields

1143164O1-47.gif(

1143164O1-47.gif  idSampleInteger,

1143164O1-47.gif  fieldNamevarchar(30),

1143164O1-47.gif  fieldValuevarchar(100)

1143164O1-47.gif)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值