可以采用以下四种技术:
动态添加数据库表字段
确保在运行时有足够的空场以动态投射阴影
以xml格式保存到单字段
更改为行,并在另一个表中存储自定义字段
现在分析一下四种技术的优劣。 但是,首先可以排除的是第一点的动态添加字段的方法。 因为在实际操作中几乎是不可能的(sqlserver太慢,oracle干脆不支持),所以几乎不用讨论就可以排除它。 剩下三点。
首先,我将介绍如何保留空白字段。 基本原理是在设计数据库表时添加额外的字段以查看以下代码:
创建表样例(
NameVarchar(12 )、
字段0 varchar (1)、
字段1 varchar (1)、
FieldNvarchar(1)。
}
然后,要查看实际运行时的需求并将字段动态分配给系统使用,可能需要一个说明分配情况的结构。
公共类可用
{
publicintcurrentunusedfieldnumber;
publicHashtableFieldToRealName;
}
数据在某个时间点的状况为CurrentUnusedFieldNumber=3,哈希表FieldToRealName的内容为' field0'='SomeId '、' field1'='AnyName ',
现在的问题是如果要协助Hibernate的话,会怎么处理呢? 以上述段的数据使用情况为例。 如果类定义是这样的:
公共类实体01
{
公共字符串名称;
公共字符串形式id;
公共字符串any name;
公共布尔Isok;
}
修改xxx.hbm.xml,使SomeId和field0对应起来可能就ok了。 但是,你怎么知道运行时有这样的类定义? 除非我们进行动态代码生成,否则可能会进行自动编译,但问题可能会去其他方面; 如果不动态定义,类只能是这样。
公共类实体01
{
公共字符串名称;
publichashtableextrafieldandvalues;
}
使用时,引用为entity 01.extrafieldandvalues.setvalue (' any name )、' boss ) )。 这可能是修改最少的,但问题是Hibernate不支持这样的方法。
介绍单场存储的方法。 使用这样的数据库表定义
创建表样例
(
NameVarchar(12 )、
XMLclob(102400 )//仅说明
)
然后对应于这样的类定义
公共类实体01
{
公共字符串名称;
公共字符串XML;
publichashtableextranameandvaluefromxml;
}
我们的代码可以这样使用。 stringid=entity 01.extranameandvaluefromxml.getvalue '。 这样解决看起来很好。 不仅不需要Available表,而且Hibernate支持看起来也很完美,但致命的问题是,如何保持高效的查询? 除非数据库系统本身支持它,否则只能用低效的substring或like创建查询,这对于大量数据是不可能的。
难道不是权衡一下,把两种方法的优点结合起来吗? 有问题。 你怎么保持两者之间的数据同步? 是否要使用存储过程分析xml内容?
所以,困境需要我们认真解决。 我们也许可以通过认真的需求分析,减少可变场的数量,但只要有可变场或可变的可能性,我们就必须始终解决这一困境。
我期待着继续讨论。
(新部分)
另一种方法是将其更改为行,并在另一个表中存储扩展字段。 定义如下。
CREATETABLESampleFields
(
idSampleInteger,
FieldnameVarchar(30 )、
现场价值评估器(100 )。
)