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 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)