Sealyu 2010-3-18
在项目中经常会碰到这样的问题: 用户要求他们的产品等实体的属性是可定制的。比如:产品的数量、高度、重量等属性,都是可以在后台增删该查的。在这种情况下,使用java建立实体就遇到问题了,因为数据库中的字段是不定的。 这种情况在一些单据、试卷等地方是很常见的。
1。目前为止,没有发现比较完美的解决方法。 之前项目中遇到了一次动态生成单据的情况,主要是通过使用几张表来存储表的结构和字段信息来实现。 这种情况下,实现查询和报表等功能时就会受到影响。 具体方法跟下面这位的类似:
我在给一家打字公司开发一个将表单的内容输入数据库的程序。表单中可能有简单的送货收据(20多个字段),可能有民意调查的表格(50多个字段),可能有保险公司的用户登记表(100多个字段)。讨厌的是这样的表单可能又几百种。
我设计的数据库如下:
表单的种类表(表1):
Form_ID //表单的种类ID
Form_Name //表单的名称
某一个表单的字段表(表2)
Field_ID //字段的ID
Field_Name //字段的名称
Form_ID //表单的种类ID,与表1连接
具体的某一个表单表(表3)
Sheet_ID //具体的某一个表单的ID
Client_ID //这个表单所属的客户ID,与客户表连接
某一个表单的字段内容表(表4)
Field_Value_ID //字段的内容ID
Field_Value //字段的内容
Field_ID //字段的ID,与表2连接
Sheet_ID //具体的某一个表单的ID,与表3连接
每增加了一种新的表单时,在表1和表2中添加如下记录:
表1:Form_ID Form_Name
A001 送货单
表2:Field_ID Field_Name Form_ID
f0001 发货日期 A001
f0002 发货人 A001
f0003 收货人地址 A001
这样,当某一个打字公司的客户要求输入这个“送货单”时,每输入一个送货单(即表单表3),表3和表4添加如下记录:(每输入一个送货单之类的表单,表3和表4都添加数据)
表3:Sheet_ID Client_ID
S001 0000001
表4:Field_Value_ID Field_Value Field_ID Sheet_ID
V0001 2001.5.8 f0001 S001
V0002 张三 f0002 S001
V0003 大连市西岗区 f0003 S001
打字公司根据具体的某一个表单的ID(Sheet_ID),结合4个表提取客户ID、表单种类名称、字段名称和字段内容存入另外的数据库。
2。还看到过一种情况,是只用一个长字符串字段,利用xml的格式来存储对应的结构,同时在java中使用xml2db等工具来解析。这种情况下,查询和报表功能同样不好实现。同时,xml节点的增删该查也不太方便。
3。最后一种方法,是直接使用数据库来实现。前几天看到DB2 9中已经支持对XML格式数据的存储和查询。使用XQUERY来配套实现查询。不过这种方法对数据库的依赖性强,目前为止,还没发现有其他数据库提供这种功能。