头图

各位社区小伙伴: 

好消息!为了帮助大家快速无痛上手 KWDB ,KWDB 研发团队基于已有场景精心打造了一个示例项目 SampleDB ,内附场景与样例数据,零门槛体验多模数据库 KWDB。

仓库地址:https://gitee.com/kwdb/sampledb

本期博客,我们就用这个 SampleDB, 带大家一起体验 KWDB 在工业物联网智能电表业务场景中的使用。

1. 项目背景

随着向工业物联网的发展,智能电表的应用日益普及,比如实时监控、数据分析、实时异常检测与预测、设备健康度评估、电价优化分析、多维度数据聚合行业标准协议集成(如 DLMS/COSEM )、边缘计算协同等。

其中,在告警检测中,不仅检测当前故障,还可以预测设备故障概率;用电量统计中加入峰谷时段的分析,帮助用户优化用电成本;实时流数据处理能力,或者与边缘计算设备的协同工作,减少数据传输延迟。

在工业物联网智能电表场景中,电表数据通常包含时序数据(电压/电流实时监测)、关系型数据(用户档案)、用户数据等多模型数据。 KWDB 通过统一查询引擎和原生多模型存储实现高效跨模型查询。

SampleDB 中的 示例一:智能电表模型 就是模拟了这一典型场景,借助这一典型场景帮助大家快速了解 KWDB 的使用。

2. 表结构设计

众所周知,KWDB 是一款 开源多模数据库,支持关系型数据库和时序数据库两种模型。在这个示例中,我们将同时使用这两种类型来存储和查询智能电表的相关数据。

关系库

关系库电表基础信息表 meter_info

核心作用: 构建电表设备全生命周期档案

存储电表的基本属性:电表 ID、安装日期、电压等级、制造商、状态、所属区域和用户 ID

CREATE TABLE rdb.meter_info (
  meter_id VARCHAR(50)   PRIMARY KEY,
  install_date DATE,
  voltage_level VARCHAR(20),
  manufacturer VARCHAR(50),
  status VARCHAR(20),
  area_id VARCHAR(20),
  user_id VARCHAR(50)
); 

关系表用户信息表 user_info

核心作用: 建立用户画像与用电行为关联

用户的基本资料,用户 ID 为主键,还有姓名、地址和联系方式。这个表用于管理用户数据,关联到电表的使用者

CREATE TABLE rdb.user_info (
  user_id VARCHAR(50)   PRIMARY KEY,
  user_name VARCHAR(100),
  address VARCHAR(200),
  contact VARCHAR(20)
);

关系表区域信息表 area_info

核心作用: 支撑电网拓扑管理与区域化运营

存储区域的信息,区域 ID、名称、负责人和所属地区。主键是 area_id,用于划分不同地理或管理区域,方便后续的区域用电统计和分析。

CREATE TABLE rdb.area_info (
  area_id VARCHAR(20)   PRIMARY KEY,
  area_name VARCHAR(100),
  manager VARCHAR(50),
  region VARCHAR(50)
);

关系表告警规则表 alarm_rules

核心作用: 实现动态可配置的智能告警引擎

存储报警规则,包括规则ID、名称、指标、操作符、阈值、严重程度和通知方式。自增的 rule_id 作为主键,方便管理和扩展报警规则。

CREATE TABLE rdb.alarm_rules(
  rule_id SERIAL PRIMARY KEY,
  rule_name VARCHAR(100),
  metric VARCHAR(50),
  operator VARCHAR(10),
  threshold FLOAT8,
  severity VARCHAR(20),
  notify_method VARCHAR(50)
);

时序库

时序表实时用电数据表 meter_data

核心作用: 承载高频时序数据流,支持实时分析

时间戳、电压、电流、功率、能量和电表 ID。这里用了 TAGS 来标记 meter_id,用于高效查询和管理时间序列数据

CREATE TABLE tsdb.meter_data (
  ts TIMESTAMPTZ(3) NOT   NULL,
  voltage FLOAT8 NULL,
  current FLOAT8 NULL,
  power FLOAT8 NULL,
  energy FLOAT8 NULL,
  meter_id VARCHAR(50)
) TAGS (meter_id VARCHAR(50) NOT NULL) 
PRIMARY TAGS(meter_id) 
retentions 0s 
activetime 1d 
partition interval 10d

3. 体验 KWDB

以下示例均采用 KWDB 自带 CLI 工具 kwbase 进行操作,您也可以 kwbase sql --insecure --host=<your-host-ip> 命令进入 KWDB 的交互式 SQL 环境或使用 KWDB 开发者中心连接 KWDB 进行操作。

准备工作

向 KWDB 中导入数据

在数据库数据目录创建 extern 目录,将 rdb.tar.gztsdb.tar.gz 解压到 extern 目录下。

rdb.tar.gz 和 tsdb.tar.gz 文件存放在 extern 目录下,您可自行下载后解压到 extern 目录下。
cd /data/kaiwudb
mkdir extern
tar xvf rdb.tar.gz
tar xvf tsdb.tar.gz

导入关系库 rdb 数据

kwbase sql --certs-dir=/etc/kaiwudb/certs -e 'import database csv data ("nodelocal://1/rdb");'  

导入时序库 tsdb 数据

kwbase sql --certs-dir=/etc/kaiwudb/certs -e 'import database csv data  ("nodelocal://1/tsdb");'

数据生成脚本

编写脚本 generate_series.sh,用于生成时序数据,脚本内容如下:

#!/bin/bash
num=$1
 
kwbase sql --certs-dir=/etc/kaiwudb/certs -e "INSERT INTO tsdb.meter_data (ts, voltage, current, power, energy,   meter_id) SELECT NOW() - (s*10)::int * INTERVAL '1 minute', 220.0 +   (s%10)::float, 5.0 + (s%15)::float*0.1, 1000.0 + (s%20)::float*50, 5000.0 +   s::float*10, 'M' || ((s%100)+1)::text FROM generate_series(1, $1) AS s;"

执行脚本,输入变量大于 1 的数字例如 100,代表生成100 条数据:

sh generate_series.sh 100

查看场景数据

执行 SQL 查询语句,查看场景数据:

典型场景

典型场景1: 时序+关系型查询 - 区域用电量TOP10

kwbase sql --certs-dir=/etc/kaiwudb/certs -e "
SELECT a.area_name, SUM(md.energy) AS total_energy
FROM tsdb.meter_data md
JOIN rdb.meter_info mi ON md.meter_id = mi.meter_id
JOIN rdb.area_info a ON mi.area_id = a.area_id
GROUP BY a.area_name
ORDER BY total_energy DESC
LIMIT 10;"

场景2: 时序+用户信息查询 - 故障电表关联分析

kwbase sql --certs-dir=/etc/kaiwudb/certs -e "
SELECT mi.meter_id, u.user_name, u.contact, a.area_name
FROM rdb.meter_info mi
JOIN rdb.user_info u ON mi.user_id = u.user_id
JOIN rdb.area_info a ON mi.area_id = a.area_id
WHERE mi.status = 'Fault';"

场景3: 时序+关系库计算 - 告警检测查询分析

kwbase sql --certs-dir=/etc/kaiwudb/certs -e "
SELECT md.meter_id, md.ts, ar.rule_name, 
       md.voltage,   md.current, md.power
FROM tsdb.meter_data md
JOIN rdb.alarm_rules ar ON 1=1
WHERE (ar.metric = 'voltage' AND (
       (ar.operator = '>'   AND md.voltage < ar.threshold) OR
       (ar.operator = '<'   AND md.voltage > ar.threshold)))
   OR (ar.metric = 'current'   AND md.current > ar.threshold)
   OR (ar.metric = 'power'   AND md.power > ar.threshold)
ORDER BY md.ts DESC
LIMIT 100;"

更多场景

场景4: 电表概要查询

kwbase sql --certs-dir=/etc/kaiwudb/certs -e "SELECT mi.meter_id,   mi.voltage_level, mi.status,
       u.user_name, a.area_name,
       (SELECT COUNT(*) FROM tsdb.meter_data   md
        WHERE md.meter_id = mi.meter_id) AS   data_points
FROM rdb.meter_info mi
JOIN rdb.user_info u ON   mi.user_id = u.user_id
JOIN rdb.area_info a ON   mi.area_id = a.area_id
WHERE mi.meter_id =   'M1';"

场景5: 区域用电量统计

kwbase sql --certs-dir=/etc/kaiwudb/certs -e "SELECT a.region, a.area_name,
       SUM(md.energy) AS total_energy,
       AVG(md.power) AS avg_power
FROM tsdb.meter_data md
JOIN rdb.meter_info mi ON   md.meter_id = mi.meter_id
JOIN rdb.area_info a ON   mi.area_id = a.area_id
GROUP BY a.region, a.area_name;"

场景 6: 查询指定电表最近24小时用电趋势

kwbase sql --certs-dir=/etc/kaiwudb/certs -e "
SELECT md.ts, md.power, md.energy
FROM tsdb.meter_data md
WHERE md.meter_id = 'M1'
AND md.ts > NOW() - INTERVAL '24 hours'
ORDER BY md.ts;"

4. KWDB 优势

  • 多模数据高效处理:基于 KWDB 多模数据库,更好地实现了关系库与时序库的数据融合导入,实现以一库管理多模态数据;
  • 实时系统预警响应:基于 KWDB 百万级数据秒级写入、亿级数据秒级读取的性能优势,电表系统可实现故障定位在 100ms 内完成,可提升停电恢复效率,降低用户投诉率,更好地维护用户隐私及电网运行安全;
  • 应用场景广泛多样:工业物联网(IIoT)智能电表是能源行业数字化转型的核心基础设施之一,通过基于 KWDB 的数据管理方案还可实现包括虚拟电厂运营、用电安全治理、碳足迹追踪等多样化场景。

5. 总结

通过以上示例,我们可以轻松体验 KWDB 在智能电表业务场景中的应用。通过统一查询引擎和原生多模型存储,KWDB 可以高效地支持关系型和时序型数据的查询和分析,为用户提供更全面、准确的数据分析和决策支持。后续我们将持续更新 SampleDB,为大家提供更多的示例场景,欢迎大家关注我们的公众号,第一时间获取最新的技术动态和产品更新。


KaiwuDB
15 声望1 粉丝

KaiwuDB 是浪潮控股的数据库企业,汇聚了全球顶尖的数据库人才,面向工业物联网、数字能源、车联网、智慧产业等各大行业领域,提供稳定安全、高性能、易运维的创新数据软件与服务,一站式满足 AIoT 等场景下数据...