永发信息网

如何设计动态字段的产品数据库表

答案:2  悬赏:50  手机版
解决时间 2021-03-11 01:22
如何设计动态字段的产品数据库表
最佳答案
可以采用四种技术:

动态增加数据库表字段
预留足够的空白字段,运行时作动态影射
用xml格式保存在单字段里
改列为行,用另外一个表存放定制字段

【一】

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

【二】

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

CREATE TABLE Sample(
name varchar(12),
field0 varchar(1),
field1 varchar(1),
fieldN varchar(1)
}

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

public class Available
{
public int CurrentUnusedFieldNumber;
public Hashtable FieldToRealName;
}

也许某一时刻的数据状况是这样的: CurrentUnusedFieldNumber=3,
哈西表FieldToRealName包含内容是("field0"="SomeId", "field1"="AnyName",
"field2=IsOk")
现在的问题是如果要配合Hibernate,如何来处理?以上段的数据使用状况为例子,如果我们的类定义是这样:
public class Entity01
{
public string Name;
public string SomeId;
public string AnyName;
public bool IsOk;
}

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

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

【三】
再来讨论单字段存储的方法,我们使用这样的数据库表定义
CREATE TABLE Sample
(
Name varchar(12),
Xml CLOB(102400) // 仅作说明而已
)

然后对应这样的类定义
public class Entity01
{
public string Name;
public string Xml;
public Hashtable ExtraNameAndValueFromXml;
}

我们的代码就可以这样使用:string id =
entity01.ExtraNameAndValueFromXml.getValue("SomeId")
了。这样解决看起来很不错,不仅不需要Available表,而且看起来Hibernate对它的支持也很完美,但是致命的问题在于:如果保持高效的查询?除非数据库系统本身对此有支持,否则就只能用低效的substring或者like做查询,这在大批量数据中根本就不可行。
是不是折衷一下,把两种方法的优点和起来?问题有来了:怎么保持两者之间数据的同步?难道要我们用存储过程去解析xml内容?
所以,一个两难的问题,需要我们认真去解决。我们通过认真的需求分析,也许可以减少可变字段的数量,但是只要有一个可变字段或者可变的可能性存在,我们始终要去解决这个两难的问题。
期待继续讨论。

【四】
还有一种方法就是改列为行,用另外一个表存放扩展字段,定义可以如下:
CREATE
TABLE SampleFields
(
idSample Integer,
fieldName varchar(30),
fieldValue varchar(100)
)
其中idSample关联到Sample表的id字段(我没有写出来)。这样的话,Hibernate很容易支持,也可以支持Sql的查询,而且可以支持把内容放到Hashtable中去,看起来是目前最好的方式了。但是在大容量数据的时候,SampleFields表的数据会是主表数据量的N倍(看定制的字段数目多少而定),同样存在有很严重的性能问题。
全部回答
create table sample( name varchar(12), field0 varchar(1), field1 varchar(1), fieldn varchar(1) } 然后看实际运行时候的需要,动态分配字段给系统使用,也许需要一个这样的结构来描述分配情况: public class available { public int currentunusedfieldnumber; public hashtable fieldtorealname; } 也许某一时刻的数据状况是这样的: currentunusedfieldnumber=3, 哈西表fieldtorealname包含内容是("field0"="someid", "field1"="anyname", "field2=isok") 现在的问题是如果要配合hibernate,如何来处理?以上段的数据使用状况为例子,如果我们的类定义是这样: public class entity01 { public string name; public string someid; public string anyname; public bool isok; } 也许只需要修改一下xxx.hbm.xml,把 someid 和 field0 做成对应就ok了。但是在运行时我们怎么知道会有这样的类定义?除非我们做动态代码生成,自动编译也许可以,但是问题也许就到其他方面去了;如果我们不用动态定义,那么类就只能是这样: public class entity01 { public string name; public hashtable extrafieldandvalues; } 使用的时候,用 entity01.extrafieldandvalues.setvalue("anyname", "boss") 的方式来引用,也许这样是修改最少的了,但是问题是hibernate不支持这样的方法。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
2005年5月21日.载文指出.牢记“两个务必 要求
商丘卖唢呐吗
鸿通汽车维修服务中心怎么去啊,有知道地址的
宝宝断奶了,想选款奶粉,今天母婴店老板推介
我孩子九岁属于超生上户口时办的出生证上的日
跪求CF载入时的图片,做壁纸用…
雄伟壮观的长城是中华民族的骄傲缩句
周百福金行地址在哪,我要去那里办事
arena品牌的泳衣的质量怎么样啊?
园田装饰材料这个地址在什么地方,我要处理点
某场地0~5m为硬塑黏土,υ=150m/s,γ=18.5k
沃客真的查封了吗?投进去的钱还能不能拿回
我微信每天要转账几万,我需要开通什么网上银
诗贝尔全屋吊顶这个地址在什么地方,我要处理
诗漫丹深肌润颜系列养肌凝露怎么使用的?是先
推荐资讯
痂,没掉可以洗澡吗
怎么网页上做一个链接 可以QQ交谈
麻辣变形计梁大魏和人飙车是哪一集
家装以什么颜色为主色调较好看
西门子烤箱与德龙烤箱哪个好
分贝直播直播时长怎么计算的啊?
卧室刷漆好还是贴壁纸好?
酒精度30 v0l是什么意思
汽车空调雪种属于危险品吗?
怎么放大浏览器页面
dnf好像更新了一把85的法杖,叫做智者千虑。
猪为什么无缘无故死
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?