案例:現需要對一些設備的信息進行存儲,設備的類型包括“除濕機”、“空調”、“風機”,其中“除濕機”的數據包括“溫度”、“濕度”、“除濕狀態”;空調的數據包括“溫度”、“狀態”;“風機”的數據包括“電流”、“電壓”、“狀態”。在設計的時候要考慮到設備類型可能會增加,每種類型的設備的數據種類也可能會改變。
設計方案一: 將列數據轉換為行數據存儲
類型表:存儲設備類型
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…… |
特點:根據屬性表中存儲的列名,直接關聯到數據表中具體的列,所以具體的數據可以存儲到“數據表”符合數據類型的任意一列中