问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-01 04:04

我来回答

1个回答

热心网友 时间:2022-04-10 11:55

可以采用四种技术:

动态增加数据库表字段
预留足够的空白字段,运行时作动态影射
用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倍(看定制的字段数目多少而定),同样存在有很严重的性能问题。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
急求高人解答 ···管理类的问题 ···!!!急急急···我会在线等... ...如果基层管理幅度为8,高层管理人员管理幅度为3,则该公司中层管理人员... ...发生化学变化的实质是( )A.分子间隔发生变化B.物质状态发生改变C... 下列变化不能说明发生了化学变化的是( )A.变化时有电子的得失或共用电... 下列描述正确的是( )A.固态物质的分子间无间隔B.液态物质的分子不断运动... 原来微信打开这个功能,能够看到马路上的街景,涨知识了! ...百度帐号被人在异地登录了,问题是没有任何人知道我的密码啊?而且也... 医疗事故纠纷和医疗损害纠纷的区别是什么 医疗纠纷与医疗事故的定义是什么? 医疗事故纠纷是指什么的 头晕恶心怎样缓解 交管12123注册地和报考驾校地方不一样 夜里梦见和一条黄金大蟒蛇,它一直追我然后我也打了它几次,后来我把它给杀死了 求高人解答 中国的一个军标准是多少人?师---班!!! 电线杆倒塌引发房屋大火具体如何赔偿 相关法律法规 参加普通话考试需要做哪些准备工作 中国人民解放军有多少兵力 荣耀畅玩7X中自带的荣耀阅读使用时调成夜间模式,如何调成日间模式 数据库表中追加字段 百度搜东西只显示3个,就让下载app是怎么回事? 继续教育问卷调查对于培训工作的展开你有什么更好的建议? 土豆如何做才能超好吃? 电线杆被大雪压塌 lol召唤师头像就是那个吐舌头很萌的熊猫和卖装备的老头的图标怎么解锁。 为什么南方雪灾中会出现大量电线杆倒塌的现象 电脑玩游戏 每次玩几个小时之后 游戏总是把CPU占满 游戏就开始卡的要命 谁知道是什么问题啊 钢琴辅导班一般是多少钱?? 银行预留手机号网上能改吗? 江铃顺达货车后玻璃窗怎么装? 汪小菲就醉酒连麦女主播道歉,你怎样看待他的行为? 不管玩啥游戏 CPU占用满了 显卡一直都不超过百分之20 有没有大神帮忙解答一下? QQ同步助手SD卡怎么导出来 iPhone自带浏览器,我把百度设为首页,为什么总是让我下载百度app? 很多次梦见自己和别的男人晚上在一起!为何不是我老公?求解梦 vivo手机v2057a多少钱 win10如何放进u盘?我已经做好*桃pe了,但是往ISO文件夹里放时发现u盘是fat32格式的 桂林银行以后会不会收取跨行取钱的手续费? 桂林银行异地跨行取款如何收费? 办理天津居住证怎么积分 手机百度糯米怎么退出当前登录的账号 什么水不能喝谜语答案 清洗空调后为什么会有黑色的丝线? 面积是121正方形边长是多少小学四年级的题怎么算? 我就想在电视上实现微信视频通话,有什么方案么? 中国神话真的全是假的吗? 酒席八个凉菜分别是? 智能电视的视频聊天解决方案 在宏海网址里,常被投诉会封号吗? 传说神话故事是真的还是假的? 中国一个军大约有多少人