MySQL数据库基础练习系列41、实时监控系统

2024-06-16 12:27:40 浏览数 (3)

MySQL数据库基础练习系列目标

很多学生或者说是初学者在学习完成数据库的基础增删改查后就自认为在数据库这里就很熟悉了,但是不接触项目根本部知道需求,我这里准备了50个项目的基本需求来让大家来熟练各类项目的列信息,让大家更好的深入项目进行实战式的练习,可以让大家在后面面试的时候有更多更丰富的资历让大家可以与面试官侃侃而谈。

数据库环境

MySQL版本:5.7.31-log

数据库字符集,所有数据库通用字符集与排序规则,支持中文数据。

字符集:utf8 排序规则:utf8_general_ci

使用工具:Navicat Premium 15,可以在下面的连接中下载

https://download.csdn.net/download/feng8403000/89403778

项目名称与项目简介

实时监控系统是一个能够实时监控和记录各种数据变化,提供实时分析和报警功能的系统。它可以广泛应用于各个领域,如环境监测、设备监控、网络监控等。系统通过收集传感器、设备或其他数据源的信息,进行实时处理和分析,帮助用户及时发现异常情况并作出响应。

主要功能包括:

  1. 用户管理:管理监控系统的用户,包括添加、删除、修改用户信息。
  2. 数据采集:从传感器、设备等数据源采集实时数据。
  3. 数据展示:以图表、表格等形式展示实时数据和历史数据。
  4. 报警管理:设置报警阈值,当数据超过阈值时触发报警通知。
  5. 日志记录:记录用户操作、报警事件等关键信息。

数据库DDL(注意创建顺序)

为了直接运行DDL语句并创建表,我们需要确保在创建含有外键约束的表之前,相关的被引用表(即外键指向的表)已经存在。所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有外键关系导致的创建异常。

代码语言:javascript复制
-- 用户表
CREATE TABLE Users (
    user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
    username VARCHAR(50) NOT NULL COMMENT '用户名',
    password VARCHAR(255) NOT NULL COMMENT '密码',
    gender ENUM('男', '女') NOT NULL COMMENT '性别',
    email VARCHAR(100) COMMENT '邮箱地址'
);


-- 数据源表(代表各种传感器、设备等)
CREATE TABLE DataSources (
    source_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '数据源ID',
    source_name VARCHAR(100) NOT NULL COMMENT '数据源名称',
    source_type VARCHAR(50) NOT NULL COMMENT '数据源类型',
    location VARCHAR(255) COMMENT '位置信息'
);


-- 实时数据表
CREATE TABLE RealtimeData (
    data_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '实时数据ID',
    source_id INT NOT NULL COMMENT '数据源ID',
    data_value DECIMAL(10, 2) NOT NULL COMMENT '数据值',
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '时间戳'
);


-- 报警规则表
CREATE TABLE AlarmRules (
    rule_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '报警规则ID',
    source_id INT NOT NULL COMMENT '数据源ID',
    threshold DECIMAL(10, 2) NOT NULL COMMENT '阈值',
    alarm_description VARCHAR(255) NOT NULL COMMENT '报警描述'
);


-- 报警记录表
CREATE TABLE AlarmRecords (
    record_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '报警记录ID',
    rule_id INT NOT NULL COMMENT '报警规则ID',
    data_id INT NOT NULL COMMENT '实时数据ID',
    alarm_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '报警时间'
);


-- 用户操作日志表
CREATE TABLE UserLogs (
    log_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID',
    user_id INT NOT NULL COMMENT '用户ID',
    operation VARCHAR(100) NOT NULL COMMENT '操作内容',
    log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '日志时间'
);

插入数据DML(注意插入数据顺序)

插入数据的时候也要注意主外键关系,如果没有外检的情况下是没有办法插入从表数据的。

代码语言:javascript复制
-- 用户表
INSERT INTO Users (username, password, gender, email) VALUES
('孙悟空', '123', '男', 'sunwukong@example.com'),
('白骨精', '123', '女', 'baigujing@example.com'),
('猪八戒', '123', '男', 'zhubajie@example.com');


-- 数据源表
INSERT INTO DataSources (source_name, source_type, location) VALUES
('温度传感器1', '温度', '一楼大厅'),
('湿度传感器1', '湿度', '二楼办公室'),
('烟雾传感器1', '烟雾', '地下停车场');


-- 实时数据表
INSERT INTO RealtimeData (source_id, data_value) VALUES
(1, 25.00), -- 假设温度传感器1的值为25度
(2, 60.00), -- 假设湿度传感器1的值为60%
(3, 0.05);  -- 假设烟雾传感器1的值为0.05ppm


-- 报警规则表
INSERT INTO AlarmRules (source_id, threshold, alarm_description) VALUES
(1, 30.00, '温度超过30度,请注意降温'),
(2, 70.00, '湿度超过70%,请注意除湿'),
(3, 0.10, '烟雾浓度超过0.1ppm,请注意检查火源');


-- 报警记录表(这里假设实时数据触发了一些报警规则)

-- 假设实时数据1(温度传感器数据)触发了报警规则1

-- 假设实时数据2(湿度传感器数据)触发了报警规则2
INSERT INTO AlarmRecords (rule_id, data_id) VALUES
(1, 1),
(2, 2);


-- 用户操作日志表

-- 假设用户ID为1的孙悟空进行了两次操作
INSERT INTO UserLogs (user_id, operation) VALUES
(1, '查看实时数据'),
(1, '修改报警规则');

遵循的数据库三范式

数据库建表的三范式(3NF,Third Normal Form)是关系型数据库设计的基本原则,用于确保数据库结构的逻辑性和减少数据冗余。这三个范式是逐步细化的,每一个范式都是在前一个范式的基础上建立的。下面我将详细解释这三个范式:

第一范式(1NF, First Normal Form)

定义

  1. 列不可分割,即数据库表的每一列都是不可分割的原子数据项。
  2. 每一列都是不可再分的最小数据单元(也称为最小的原子单元)。

解释

  • 在第一范式中,主要关注的是列的原子性。也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。
  • 例如,如果有一个“地址”列,它包含了街道、城市、省份和国家等信息,那么这就违反了第一范式。应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”和“国家”。

第二范式(2NF, Second Normal Form)

定义

  1. 满足1NF。
  2. 非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。

解释

  • 第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。
  • 在第二范式中,一个表只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
  • 如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。

第三范式(3NF, Third Normal Form)

定义

  1. 满足2NF。
  2. 非主键列必须直接依赖于主键,不能存在传递依赖。即非主键列必须直接依赖于整个主键,而不能依赖于主键的一部分。

解释

  • 第三范式是在第二范式的基础上进一步细化的。它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。
  • 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键或外键与原表进行关联。

0 人点赞