为了实现扩展属性,我想应有1、扩展属性定义表 2、扩展属性值表,前者记录扩展属性的定义,后者则保存扩展属性的值。但是不同的扩展属性值的数量不同,如“姓名”属性只有一个值,而“兴趣爱好”则有多个值,扩展属性值表应如何设计呢?我想有下面几种方式:
1、属性值表与属性定义表一一对应,只有一条记录,多值用“,”隔开
2、属性值表中一个属性可以有多条值记录,无论单值还是多值,取时都按list获得数据(属性ID和值作为复合主键,或者干脆不设置主键)
3、再加一个表用于记录多值的情况,把单值、多值情况分开。哪一种方式好呢?我觉得这应是一个普遍的需求,大家可能会有更好的解决方案,请指教,谢谢!

解决方案 »

  1.   

    是都以varchar形式放在表中的,但是属性定义中有个一个字段记录其基本类型,还有一个字段记录其参考类型,参考类型可能是某个实体表如“用户”或者某个枚举,即一种业务类型。
    这套东西为许多不同的应用提供统一的扩展模式,这种扩展可按需随时增加,加字段是实现不了的,不同应用仍可能有自己的冗余字段,两者作用不同。另外,对扩展属性的处理可以实现为通用的,而不同应用的表完全不同,冗余字段的不同处理只能各自单独实现。楼上两位支持用“,”隔开多个值的方式,这些值通常只是ID,显示时必须显示为该对象的名称,用“,”隔开的方式需要分拆字符串且在分拆前后两次访问数据库,像如属性“管理区域”定义了可以管辖的部门,可以是多个,实现时需要取出该值按“,”分拆为多个部门ID,然后再访问部门表取出部门名称或其它数据。如果用第二种或第三种方式,用稍微复杂点的sql一次就可以取出了,这样好吗?
      

  2.   

    在第二个表中加一个字段。用户ID不就OK了,查询都时候用用户ID做为一个查询条件不就分得很清楚吗?
      

  3.   

    属性值表打散是什么意思?第二个表加字段?用户ID仅是一个例子,属性值表中可能存放任何对象的ID我上面所列第一种用“,”分隔多个值的方式,还得有一个字段确定这个数据是单值还是多值的,是多值的需要分拆字符串等完全不同的处理。如果用第二种方式,多个值存多条记录,取值时规则都是一样的,单值的话相当于list中只有一个值似乎处理起来更简单一点。你认为呢?
      

  4.   


    可以的话 不建议你这么做 因为鄙人曾经也尝试过这个问题。。打个比方 我曾经做过一个类似工资管理的东西 每个员工有对应一个帐套(根据帐套来计算每个员工的工资 当然 是这个月工资的所有内容) 每个帐套的工资项可能不同 每个月的工资还可以继承上一个月工资(这个功能一想到我现在左边的蛋蛋还疼。。)简单来说吧 就是让字段活起来 并且这些字段是要作为查询出来的记录给客户看的(不是什么属性 是类似于列表记录的东西)结果就是 非常的慢 因为原本可以放到一条记录的东西 让我分成了6条7条 赶上逢年过节得10条11条 我只能遗憾的说 效果我是实现了 字段的确是动态的(动的不能再动了。。) 但是 几乎没有办法去利用他所以我建议你稍微考虑下 3L那个大叔说的没错 基本字段必须有 特殊字段你可以另加一个表 但是千万不要想一个属性条记录 那样的话 我保证你这个东西做完用不了(对系统速度没要求的同志大可以WS。。) 您的需求看起来比我的稍微简单些(我还要要求计算 还有工资继承啊 乱七八糟的事情) 如果您觉得没问题 那您做。。