weixin_42350621 2009-11-30 20:03
浏览 411
已采纳

关于用户自定义字段

      最近工作上遇到了这样一个问题,就是关于系统用户可对系统预置管理对象进行属性的自定义。在数据库中的体现就是用户可以追加字段。

      为此看了不少相关的资料,发现遇到这一问题的人不在少数,但可供参考的解决方案却不是很多。其实包括很多比我资深的师兄师长们都对这一需求是抵触的,认为这是一个不可接受需求,认为能有这样的需求,完全是在需求的分析上做的不够彻底。他们这样的一些看法我本人也是赞同的。但有时我们也不得不承认这样的需求在某种情况下的存在是有其理由的。就拿我们公司的情况来说,一个系统的后台管理,比如说注册用户的管理,你可以尽量地为用户考虑周全,预置很多的属性,但怎么做,也不可以满足所有用户的需求,有的用户需要手机号,有的需要工作证件号码,有的是多个邮箱等等。所以在这增加一个用户自定义的功能是很必要的。

      对于这个问题的解决,我在看过相关资料后,发现主要有以下三种方案:

      1)系统的数据库操作使用JDBC的方式,在POJO中,用一个MAP来对增加的字段进行操作。在这个思路的基础上,可以考虑整个POJO的对象里,只有一个MAP,它来保存所有字段名称和值。

      2)上面那种是不采用ORM的方式,采用ORM的好处我想不必多说,而我最看重的就是它对跨数据库的良好支持。我这里只说说HIBERNATE,HIBERNATE已经有了动态加裁新增字段的功能。缺点是实现起来比较麻烦,还有就是它是通过MAP得到新增字段的值的,在考虑到与页面显示,与STRUTS的结合并不好实现。

      3)就是预留一个TEXT的字段,然后,用"符号"区分,将区分的内容,和列名:值写出来,最后显示的时候用Split进行分开。

     我最后是采用了第三次方式,其实在这也只是大概的提一下,给正遇到该问题的人提供一些参考,具体的实现在这就不提了。哪位大侠有更好的方案,欢迎赐教!


问题补充
cuiyi.crazy 写道
KEY-Value表是值得推荐使用的

目前的方式是除了固有字段外,自定义字段都是用XML文件来保存,自定义字段的定义也是通过XML文件来描述。这是我们头让这么弄得。其实哪种方式都能走的通,只是实现的复杂程度,和使用的方便与否。
问题补充
cuiyi.crazy 写道

KEY-Value表是值得推荐使用的

这方式考虑过,不过这种方式,当有一定数量的记录时。会不会这个保存KEY-Value的表的记录数过于庞大呢?
  • 写回答

4条回答

  • archiwlg 2009-11-30 20:03
    关注

    你的方案明显有问题,用户要做统计怎么办?

    我也曾经做过一个这样的系统,当时我也是用key-value表来实现的。
    基本结构是:

    DynProp表:

    dynPropId | parentId | dynPropType | dynPropValue
    动态属性ID | 主表记录ID | 动态属性类型 | 动态属性值

    在Hibernate中设置一个一对多Set,关联parentId提取DynProp对象。

    这种性能上其实没有问题,和主表关联有索引支持,按值搜索首先用有索引dynPropType作为条件过滤掉其他类型,再搜索value,性能基本没有太大问题。

    这种方式下可以进行统计,缺点是效率会降低,因为要做关联。而且dynPropValue只能是弱类型,必须由系统进行类型转换。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器