请问保存 MQTT 的数据应该如何设计数据库结构 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Glkcv
V2EX    程序员

请问保存 MQTT 的数据应该如何设计数据库结构

  •  
  •   Glkcv 2024-05-22 15:03:15 +08:00 2390 次点击
    这是一个创建于 509 天前的主题,其中的信息可能已经有所发展或是发生改变。

    第一次使用这个协议,服务器使用的 emqx ,具体流程是 [多个传感器->网关->emqx ] ,问题主要是出在了数据是网关把所有传感器数据一起发布,但是这个网关下又不能保证每个项目的传感器数量是一致的

    目前的消息结构大概是这样:

    { "data": [ -0.06106870248913765, 5.2061066627502441 ], "time": "2024-05-22T06:47:24.391927" } 

    只发送了传感器的数据,具体是哪个设备根据 0,1,2 去对应,但是可以预见的问题是这个数据设备端全靠手写配置去对应,万一手抖就对应不上了,也考虑过给每个传感器一个唯一的编号,但是问了硬件的小伙伴说拿不到一个唯一的值,如果要靠手动分发可能会有些复杂

    绕了一圈后还是想着回到上面的消息结构,毕竟出厂后增减传感器的几率不大,但是现在出现了一个问题就是这个数据不好存,因为每个项目的传感器数量不一致,如果不分配一个传感器的唯一值,就不好把传感器的值单独放在一个表,如果放在一条里有没法确定要加几个传感器的键,如果把数据放在一起,又怕影响查询效率

    希望有大佬可以指点一二,谢谢

    24 条回复    2024-05-23 09:55:05 +08:00
    ipoh
        1
    ipoh  
       2024-05-22 15:12:39 +08:00   1
    | 网关 ID | 设备索引(0,1,2...) | Data |
    如果是我会这样设计
    IvanLi127
        2
    IvanLi127  
       2024-05-22 15:20:56 +08:00   1
    看起来这情况只能把网关 id 加传感器索引作为传感器的 id 了,问题就变成网关去转还是 mqtt 之后的程序去转了。
    Glkcv
        3
    Glkcv  
    OP
       2024-05-22 15:34:17 +08:00
    @ipoh 这样就怕索引有变动
    Glkcv
        4
    Glkcv  
    OP
       2024-05-22 15:35:36 +08:00
    @IvanLi127 感觉比较好的方式是这样,但是一个个去对应这些设备可能会比较麻烦
    wssy001
        5
    wssy001  
       2024-05-22 15:35:44 +08:00   1
    时序数据库了解一下
    Eiden
        6
    Eiden  
       2024-05-22 15:38:19 +08:00   3
    硬件的偷懒吧, 传感器里有单片机吧, 有单片机就有唯一编号, 这种场景肯定传感器要编号的
    KongLiu
        7
    KongLiu  
       2024-05-22 15:42:48 +08:00   1
    硬件怎么可能拿不到,最起码的 MAC 地址有吧,不过我们的做法是硬件第一次上传数据都是 000000 ,然后服务器这边看到是 000000 ,就会给他下发一个唯一编码
    Glkcv
        8
    Glkcv  
    OP
       2024-05-22 15:56:35 +08:00
    @Eiden 这个还得再去问问,我感觉也不太可能拿不到
    @KongLiu 这个不太适用于下发,主要是没法知道那个是什么传感器
    Glkcv
        9
    Glkcv  
    OP
       2024-05-22 15:57:06 +08:00
    @wssy001 还在设计数据库的阶段
    cnuser002
        10
    cnuser002  
       2024-05-22 16:19:20 +08:00   1
    传感器脱钩的话,那你就只能以网关+索引去关联了吧,你看配置文件在哪写吧。
    至于数据库,时序数据没有特别要设计的吧, 时间戳 ,数字,然后就是索引啦。
    Glkcv
        11
    Glkcv  
    OP
       2024-05-22 16:27:15 +08:00
    @cnuser002 看样子需要分发一个唯一 id ,数据库里靠 0,1,2 索引感觉会出问题
    opengps
        12
    opengps  
       2024-05-22 16:28:28 +08:00   1
    最好的存储结构是跟你数据使用方式有直接关系。
    你这只列出了数据结构,目前最多可以知道怎么设计可以保证写入快。还没有读取场景来决策怎么兼顾读取快
    luman
        13
    luma  
       2024-05-22 16:35:49 +08:00   1
    硬件忽悠你,问下他环境。肯定能获取到 uid
    cxsz
        14
    cxsz  
       2024-05-22 16:58:34 +08:00   1
    我司也是类似的,有一个终端来收集各个传感器信息,统一 mqtt 发送到服务端

    传感器大部分都是串口协议给终端的,解决方案是,把串口接入的线序,按顺序编号编好,然后硬件终端要维护个点表,按顺序获取数据,就能对应到具体的传感器了,给服务端的时候,不光要上送数据,点表也要同步上送
    Glkcv
        15
    Glkcv  
    OP
       2024-05-22 17:04:04 +08:00
    @cxsz 也是个好办法
    Glkcv
        16
    Glkcv  
    OP
       2024-05-22 17:06:33 +08:00
    @opengps 没有更好办法就设备参数里加 uuid ,直接保存
    Curtion
        17
    Curtion  
       2024-05-22 17:56:23 +08:00   1
    硬件设备一定有唯一值, 你问问传感器和网关是什么协议通信, 就算传感器没有上报自身唯一信息, 也可以从通信协议中找一个唯一值.
    xylophone21
        18
    xylophone21  
       2024-05-22 20:15:40 +08:00   1
    > 毕竟出厂后增减传感器的几率不大
    看起来像深坑
    opengps
        19
    opengps  
       2024-05-23 07:45:09 +08:00
    @Lexgni uuid 不合适,你这种叫做 iot,最好的办法是类似于时序数据库的方式来存储,最佳的类主键设计应当是 time
    0xsui
        20
    0xsui  
       2024-05-23 08:20:07 +08:00   1
    有这么一个国家标准《水文监测数据通信规约》,可以参考。
    Glkcv
        21
    Glkcv  
    OP
       2024-05-23 08:37:23 +08:00
    @opengps #19 不加的话也可以区分是哪个传感器产生的数据吗
    Glkcv
        22
    Glkcv  
    OP
       2024-05-23 08:43:24 +08:00
    @0xsui 看了下有很多格式,确实有比较适合的格式
    opengps
        23
    opengps  
       2024-05-23 08:48:53 +08:00
    @Lexgni 区分来自哪个设备:如果原始数据包不带,那就需要你自己增加识别,要么改造消息队列加入传感器自身 id (首推),要么根据实际配置能通过客户端来源 IP 识别(适用场景较少,不推荐这种)
    jimrok
        24
    jimrok  
       2024-05-23 09:55:05 +08:00
    不需要考虑这么紧凑的数据格式吧,数据错了造成的损失比网络开销要大很多。如果网关丢掉了设备的信息,还是让网关把格式改一下,增加传感器的 id 数据到后端。一般都是设备直接对接 mqtt 的 server ,mqtt 的协议里面应该有设备的 session 数据结构,应该是能将数据合并在一起的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1320 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:13 PVG 01:13 LAX 10:13 JFK 13:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86