Sealyu

--- 博客已迁移至: http://www.sealyu.com/blog

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  618 随笔 :: 87 文章 :: 225 评论 :: 0 Trackbacks
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来配套实现查询。不过这种方法对数据库的依赖性强,目前为止,还没发现有其他数据库提供这种功能。

posted on 2010-03-18 15:59 seal 阅读(1167) 评论(0)  编辑  收藏 所属分类: 数据库

只有注册用户登录后才能发表评论。


网站导航: