问题
有数据采集设备,服务器,上位机用户显示三部分,采集设备将采集的数据发送至服务器。服务器将数据保存,上位机读取服务器保存的数据库显示。当出现多设备,多用户时,如何通过多设备对应多用户,可能的情况有一台设备一个用户,一台设备多个用户,多台设备一个用户,多台设备多个用户 我在数据库都如何配置和保存数据 上位机如何读取和保存数据
方案
在多设备多用户的系统中,数据库设计和数据交互逻辑需要兼顾 灵活性、扩展性 和 安全性,以支持以下四种核心场景:
一、数据库设计(关系型数据库,如 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)优化存储,请继续提问!