存储动态数据时,数据库的设计方法

案例:现需要对一些设备的信息进行存储,设备的类型包括“除湿机”、“空调”、“风机”,其中“除湿机”的数据包括“温度”、“湿度”、“除湿状态”;空调的数据包括“温度”、“状态”;“风机”的数据包括“电流”、“电压”、“状态”。在设计的时候要考虑到设备类型可能会增加,每种类型的设备的数据种类也可能会改变。
 
设计方案一: 将列数据转换为行数据存储
 
类型表:存储设备类型
Type
Id Name
1 除湿机
2 空调
3 风机
 
属性表:关联类型表,存储每种类型的属性
Property
Id TypeId Name
1 1 温度
2 1 湿度
3 1 除湿状态
4 2 温度
5 2 状态
6 3 电流
7 3 电压
8 3 状态
 
设备表:关联类型表,存储设备信息
Device
Id TypeId Name
1 1 除湿机1
2 1 除湿机2
3 1 除湿机3
4 2 空调1
5 2 空调2
6 2 空调3
7 3 风机1
8 3 风机2
9 3 风机3
 
数据表:关联设备表,存储设备数据,但不包含具体的数据
Data
Id DeviceId CTime
1 1 xxx
2 2 xxx
 
详细表:关联数据表和属性表,存储设备具体的数据
Detail
Id DataId PropertyId
     
 
特点:标准的关系型数据库,设计好后基本不需要修改表的结构;在获取设备数据信息的时候,需要关联查询,当数据量较大时,会导致查询性能问题
 
设计方案二:每种类型的设备新建一张表来存储
 
类型表:存储设备类型和对应的表名
Type
Id Name TableName
1 除湿机 ChuShiJi
2 空调 KongTiao
3 风机 FengJi
 
属性表:关联类型表,存储设备属性和列名
Property
Id TypeId Name ColumnName
1 1 温度 WenDu
2 1 湿度 ShiDu
3 1 状态 ZhuangTai
4 2 温度 WenDu
5 2 状态 ZhuangTai
6 3 电流 DianLiu
7 3 电压 DianYa
8 3 状态 ZhuangTai
 
设备表:关联类型表,存储设备信息
Device
Id TypeId Name
     
 
除湿机表:
ChuShiJi
Id CTime WenDu ShiDu ZhuangTai
         
 
空调表:
KongTiao
Id CTime WenDu ZhuangTai
       
 
风机表:
Id CTime DianLiu DianYa ZhuangTai
         
 
特点:分表后,单表数据量会减少,单类型查询会很快;属性修改后需要修改相应的表结构,而且在查询前要先根据类型表和属性表定位查询位置
 
设计方案三:使用分隔符把设备数据拼接后,存储到一列中
 
类型表:存储设备类型
Type
Id Name
   
 
属性表:关联类型表,存储每种类型的属性
Property
Id TypeId Name
     
 
设备表:关联类型表,存储设备信息
Device
Id TypeId Name
     
 
数据表:关联设备表,存储设备数据,其中一列存储所有的具体数据
Data
Id DeviceId Data
    温度※湿度※状态
 
特点:查询方便,但需要对具体的数据进行相关的操作,比如统计分析时会很麻烦
 
设计方案四:单表多列存储
 
类型表:存储设备类型
Type
Id Name
1 除湿机
2 空调
3 风机
 
属性表:关联类型表,存储每种类型的属性和列名
Id TypeId Name ColumnName
1 1 温度 c1
2 1 湿度 c2
3 1 状态 c3
4 2 温度 c1
5 2 状态 c3
6 3 电流 c1
7 3 电压 c2
8 3 状态 c3
 
设备表:关联类型表,存储设备信息
Id TypeId Name
     
 
数据表:关联设备表,存储设备数据,具体数据存储到多列中
Id CTime DeviceId c1 c2 c3 c4 c5……
               
 
特点:根据属性表中存储的列名,直接关联到数据表中具体的列,所以具体的数据可以存储到“数据表”符合数据类型的任意一列中