如果有各种设备,例如空调,广告灯...这些设备都是存在不同的属性,空调有风速,温度;广告灯有亮度;而且这些设备的属性值都会用到,而且属性可能会新增
现在问题是,如果以后会动态新增一个排气扇设备,有风速等属性,我的表该如何设计才能更好地扩展,在新增各种设备以及属性的时候不需要改动表结构...请大家支招吧...数据库设计扩展Java结构

解决方案 »

  1.   

    这样可以吗?在数据库中加一个int type字段,用来判断是那种设备,不管来多少种都可以
      

  2.   

    能否把非公共的这些属性值弄成一个聚合,存放在一个字段中?
    比如json格式字符串。
    我也没什么经验,期待高手解答
      

  3.   

    设计方案很多啊。
    推荐一种适合初学者的吧:
    1、首先归集产品的通用属性,只需要80%产品有这种属性即可,比如:重量、颜色、尺寸这类;
    2、通用属性直接作为字段存在;
    3、附加属性用违反 1NF 的方式,直接用JSON或其它方式组装,存入一个扩展域字段。
    通用属性往往需要在列表中:显示(Select)、过滤(where)、排序(Order);所以需要直接成为字段。
    非通用属性一般都是在显示某产品明细信息时才需要使用,所以存储时可以做组装。
      

  4.   

    设计两张表:设备表:id,name。
      

  5.   

    我晕,还没写完就出去了。
    属性表:id,name,fk。
    这样增加任何设备,任何属性都可以啊
      

  6.   


    我猜测下你的主体设计,看是否类似:
    1、存储表采用横表,也就是一行即可存储一个完整设备的所有属性;
    2、存储表的字段,大部分是不含业务语义的,取名可以是 F01、F02、F03;
    3、有分类表和字段语义对照表,分类表包含所有设备种类;
    4、字段语义对照表,标明每个设备种类在存储表中的字段,其业务语义是啥,比如F01是 重量;
    是否类似这种?
      

  7.   

    我晕,还没写完就出去了。
    属性表:id,name,fk。
    这样增加任何设备,任何属性都可以啊咔咔,需要继续加深理解
      

  8.   


    我猜测下你的主体设计,看是否类似:
    1、存储表采用横表,也就是一行即可存储一个完整设备的所有属性;
    2、存储表的字段,大部分是不含业务语义的,取名可以是 F01、F02、F03;
    3、有分类表和字段语义对照表,分类表包含所有设备种类;
    4、字段语义对照表,标明每个设备种类在存储表中的字段,其业务语义是啥,比如F01是 重量;
    是否类似这种?简单的来说就是非确定意义属性记录,然后再加定义描述关联属性记录?
      

  9.   

    我觉得好多人都想简单了,自己做了就知道了,
    你要想想如何不改变表任何表的设计就可以任意添加各种类型的属性,包括int,string,date型等等,
    然后这些属性的值又如何存储,
    最后又如何查询某一种设备的某一个属性值,
    这绝不是2,3张表可以搞定的
      

  10.   

    类型都可以转换的。这不是问题,当然不可能拿String去对于int了。
    这看你如何去对应了。不管谁去控制,你取到的数据和你表里的字段对应上就行了。
      

  11.   


    确实做过:
    从垂直属性表(属性全部用varchar,使用时根据配置转换),
    到无业务语义字段表(属性共255项,预留不同类型的,但大部分仍然是varchar),
    到1主表+N扩展表(公共属性放主表,跟类型相关属性放专用扩展表,扩展表自动可按需在Web页面动态配置),
    到主属性+扩展XML(公共属性放主表,整个实体的所有属性完整保存一份XML,字段类型由XSD管理;展现的时候直接把XML读出来扔给表单,自动就绑定回去了)。
    目前综合来看,还是最后一种性价比适中。
    能否简单介绍下你的模型?
      

  12.   


    确实做过:
    从垂直属性表(属性全部用varchar,使用时根据配置转换),
    到无业务语义字段表(属性共255项,预留不同类型的,但大部分仍然是varchar),
    到1主表+N扩展表(公共属性放主表,跟类型相关属性放专用扩展表,扩展表自动可按需在Web页面动态配置),
    到主属性+扩展XML(公共属性放主表,整个实体的所有属性完整保存一份XML,字段类型由XSD管理;展现的时候直接把XML读出来扔给表单,自动就绑定回去了)。
    目前综合来看,还是最后一种性价比适中。
    能否简单介绍下你的模型?我也想了解下
    flagiris 
    的模型设计
      

  13.   

    确实可以这样做,不过不太好两列:第一列name varchar  第二列value varchar
    把以前的 where 温度 = 3
    改成 where name = 温度 and value = 3不过最好用mongodb 支持非结构存储
    要不就用postgresql 支持数组
      

  14.   

    建议使用 NoSQL。 处理属性,是长项。推荐 MangoDB