問題
有數據采集設備,服務器,上位機用戶顯示三部分,采集設備將采集的數據發送至服務器。服務器將數據保存,上位機讀取服務器保存的數據庫顯示。當出現多設備,多用戶時,如何通過多設備對應多用戶,可能的情況有一臺設備一個用戶,一臺設備多個用戶,多臺設備一個用戶,多臺設備多個用戶 我在數據庫都如何配置和保存數據 上位機如何讀取和保存數據
方案
在多設備多用戶的系統中,數據庫設計和數據交互邏輯需要兼顧 靈活性、擴展性 和 安全性,以支持以下四種核心場景:
一、數據庫設計(關系型數據庫,如 MySQL/PostgreSQL)
1. 核心表結構設計
-- 用戶表(存儲用戶信息)
CREATE TABLE users (user_id INT PRIMARY KEY AUTO_INCREMENT, -- 用戶唯一IDusername VARCHAR(50) UNIQUE NOT NULL, -- 用戶名password_hash VARCHAR(255) NOT NULL, -- 密碼哈希(加密存儲)role ENUM('admin', 'user') DEFAULT 'user'-- 角色(管理員/普通用戶)
);-- 設備表(存儲設備信息)
CREATE TABLE devices (device_id INT PRIMARY KEY AUTO_INCREMENT,-- 設備唯一IDdevice_name VARCHAR(100) NOT NULL, -- 設備名稱(如 "D1", "D2")ip_address VARCHAR(15) NOT NULL, -- 設備IP地址description TEXT -- 設備描述
);-- 用戶-設備關聯表(多對多關系)
CREATE TABLE user_device (user_id INT NOT NULL, -- 外鍵:關聯 users.user_iddevice_id INT NOT NULL, -- 外鍵:關聯 devices.device_idaccess_level ENUM('read', 'write') DEFAULT 'read', -- 訪問權限PRIMARY KEY (user_id, device_id), -- 聯合主鍵(唯一約束)FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,FOREIGN KEY (device_id) REFERENCES devices(device_id) ON DELETE CASCADE
);-- 數據表(存儲設備采集的數據)
CREATE TABLE sensor_data (data_id BIGINT PRIMARY KEY AUTO_INCREMENT,-- 數據唯一IDdevice_id INT NOT NULL, -- 外鍵:關聯 devices.device_idtimestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 采集時間temperature DECIMAL(5,2), -- 示例字段:溫度humidity DECIMAL(5,2), -- 示例字段:濕度voltage DECIMAL(5,2), -- 示例字段:電壓FOREIGN KEY (device_id) REFERENCES devices(device_id) ON DELETE CASCADE
);
2. 表結構說明
表名 | 功能說明 |
---|---|
users | 存儲用戶信息,包括身份認證和角色 |
devices | 存儲設備元數據(名稱、IP等) |
user_device | 管理用戶與設備的多對多關系及權限 |
sensor_data | 存儲設備采集的傳感器數據 |
3. 支持的場景
場景 | 數據庫配置方式 |
---|---|
一臺設備一個用戶 | 在 user_device 中為一個 user_id 和一個 device_id 配置權限 |
一臺設備多個用戶 | 在 user_device 中為多個 user_id 關聯同一個 device_id |
多臺設備一個用戶 | 在 user_device 中為一個 user_id 關聯多個 device_id |
多臺設備多個用戶 | 在 user_device 中交叉關聯多個 user_id 和多個 device_id |
二、數據采集與存儲流程
1. 設備端邏輯
- 數據發送:設備通過 TCP/HTTP/WebSocket 協議將數據發送到服務器。
- 數據格式(示例 JSON):
{"device_id": 1,"timestamp": "2025-04-05T14:30:00Z","temperature": 25.5,"humidity": 60.0,"voltage": 3.7 }
2. 服務器端邏輯
- 接收數據:服務器監聽端口,接收設備發送的 JSON 數據。
- 數據驗證:檢查
device_id
是否存在,數據格式是否合法。 - 數據存儲:將數據插入
sensor_data
表。INSERT INTO sensor_data (device_id, timestamp, temperature, humidity, voltage) VALUES (1, '2025-04-05 14:30:00', 25.5, 60.0, 3.7);
三、上位機(用戶端)數據讀取與顯示
1. 用戶認證與權限控制
- 登錄流程:
- 用戶輸入用戶名和密碼。
- 服務器驗證密碼哈希,生成 JWT Token(含用戶 ID 和角色)。
- 后續請求攜帶 Token 進行身份驗證。
2. 數據查詢邏輯
-
根據用戶權限動態篩選數據:
-- 查詢用戶有權限訪問的所有設備的最新數據 SELECT d.device_id, d.device_name, sd.temperature, sd.humidity, sd.timestamp FROM user_device ud JOIN devices d ON ud.device_id = d.device_id JOIN sensor_data sd ON d.device_id = sd.device_id WHERE ud.user_id = 1001 ORDER BY sd.timestamp DESC;
-
分頁與過濾:
-- 按時間范圍和設備ID篩選數據 SELECT * FROM sensor_data WHERE device_id = 1AND timestamp BETWEEN '2025-04-05 00:00:00' AND '2025-04-05 23:59:59' LIMIT 100 OFFSET 0;
3. 數據展示
- 前端界面(如 Web 或桌面應用):
- 根據用戶權限動態加載設備列表。
- 使用圖表庫(如 ECharts/D3.js)繪制實時數據。
- 支持導出 CSV/Excel。
四、權限管理與安全性
1. 數據訪問控制
- 行級權限:在查詢時通過
user_device
表限制用戶只能訪問授權設備的數據。 - 字段級權限:通過視圖(View)限制用戶只能查看特定字段(如僅讀取
temperature
,隱藏voltage
)。
2. 數據安全
- 傳輸加密:使用 HTTPS/TLS 加密通信。
- 存儲加密:敏感字段(如密碼)使用 AES 加密存儲。
- 審計日志:記錄用戶操作(如查詢、導出數據)。
五、性能優化建議
1. 數據庫優化
- 索引:為
sensor_data.device_id
和sensor_data.timestamp
添加復合索引。 - 分表:按時間或設備ID分表(如
sensor_data_202504
)。 - 緩存:使用 Redis 緩存高頻訪問的設備數據。
2. 服務器優化
- 異步寫入:使用消息隊列(如 Kafka/RabbitMQ)緩沖設備數據,再異步寫入數據庫。
- 負載均衡:多服務器集群部署,通過 Nginx 負載均衡。
3. 上位機優化
- 分頁加載:避免一次性加載大量數據,采用懶加載。
- WebSocket 實時推送:設備數據更新后,服務器主動推送給上位機。
六、總結
功能模塊 | 關鍵點 |
---|---|
數據庫設計 | 通過 user_device 表實現多對多關系,靈活支持各種場景 |
數據采集 | 設備發送 JSON 數據,服務器驗證后存儲到 sensor_data |
權限控制 | 通過 user_device 限制用戶訪問的設備和字段 |
上位機查詢 | 動態生成 SQL 查詢,結合分頁和過濾條件 |
性能優化 | 索引、分表、緩存、異步寫入、WebSocket 推送 |
如需進一步了解 如何實現設備數據的實時同步、如何設計權限的動態配置界面,或 如何使用時序數據庫(如 InfluxDB)優化存儲,請繼續提問!