室内温度监控的 mysql 数据库设计

2019-09-08 14:55:48 +08:00
 kayseen
需求:
室内温度实时监控

1.展示近 30 分钟内的实时室内温度(比如 11:30, 11:31 的温度分别是多少)
2.展示同一时刻的近 7 天的温度变化(比如现在是 11:30,需要展示的是往前共计 6 天的 11:30 的温度)


请教下这种需求的数据库应该怎么设计啊?
要展示近七天历史的每分钟的室内温度,总不能在数据库给每分钟都建立一个字段吧....请大家赐教
9307 次点击
所在节点    Python
74 条回复
deepdark
2019-09-09 07:47:44 +08:00
这么点数据,txt 都存了
code2019
2019-09-09 07:50:16 +08:00
influxdb 时序数据库了解一下
silvernoo
2019-09-09 08:11:03 +08:00
rrdtool
CallMeReznov
2019-09-09 08:47:04 +08:00
@opengps #23 好东西啊,兄弟
himesens
2019-09-09 09:19:14 +08:00
一分钟存一行,至于怎么取其中某个站点最新 30 行,和隔 1440 行取一条,后台处理,一分钟刷一次,表字段越少越好。你甚至可以一次查完七天近万条数据循环+1 解决,整个处理时间都不会超过 1 秒。
leafre
2019-09-09 09:30:59 +08:00
有难点吗?
Aresxue
2019-09-09 09:41:25 +08:00
当前没必要引入时序数据库,less is more。
mysql 的话就按一分钟一条数据存储好了,如果后期数据量真的大起来,那就把近来七天的数据作为热点数据放到缓存里,过期时间设为七天,性能这方面完全不会有啥问题。
EricInBj
2019-09-09 09:43:08 +08:00
用 influxdb
keakon
2019-09-09 09:56:54 +08:00
clickhouse
zjyl1994
2019-09-09 10:33:34 +08:00
正常存 datetime 就行了,select 的时候提前算好了对应的时间点进去 wherein 就能提出来对应的数据
GTim
2019-09-09 11:11:09 +08:00
楼上各位推荐 influxdb 是认真的吗??????

如果是精确到分,只有一个温度计,完全可以用 bigint(20) 来表示时间 1909091010

算上温度 float 或者 decimal 就算 1000w 条数据,空间也是小的可怜好吗

如果不止一个设备,再加一个 did 设备编号,8 + 4 + 4 字节 = 16 字节
GTim
2019-09-09 11:20:57 +08:00
@Aresxue 数据量根本就不大,这个表最多只有 5 个字段,自增 id + 时间戳 + 温度 + date(ymdhi) + 设备 id 只需要 24 字节,1g 理论上能存 4kw 数据
Aresxue
2019-09-09 11:24:37 +08:00
@GTim 这里只是假设,比如说忽然要求细粒度到 ms,或者后续可能远远不止温度,像物联网有烟感、雾感等生活上方方面面的指标。
GTim
2019-09-09 11:30:41 +08:00
@Aresxue 细腻到 ms 或 ns 也就是 bigint 的问题,时间戳 * 1000 或者 1000000 就可以了,至于烟感、雾感,不能放这个表,不然插入太频繁会掉性能。
w516322644
2019-09-09 11:33:38 +08:00
@crayygy 这有啥误解的,数据多的时候,你时间戳还得处理下,有分钟字段的话,可以直接查。
JosephHan
2019-09-09 11:35:04 +08:00
很简单的需求, 不就是一个表记录 id, room_id, datetime, temperature 吗? 每分钟一次的记录, mysql 哪里承受不了这点数据了? 我自己用的还记录了湿度和气压呢, 完全没问题.
ZXCDFGTYU
2019-09-09 12:49:51 +08:00
时序数据库足够了,mysql 的话就按楼上说的就 ok
Aresxue
2019-09-09 14:09:33 +08:00
@GTim 我说的 ms、ns 是针对你回复我数据量不大的,改成 ms、ns 主要是数据量的上升,比如 ms 就是 60*100 倍的数据量了,这时候数据量就很可观了,要考虑下性能的问题了。烟感雾感也只是举例子后续可能的扩展性问题,当然不可能直接加进去,但是你一张表只放一类数据对于 mysql 来说是很浪费的。
ai88030669
2019-09-09 16:21:30 +08:00
我觉得 你问的东西 有问题 我想你问的是 sql 怎么写吧...
skyqqcc
2019-09-09 17:23:54 +08:00
感谢回复者 Reply 56
JosephHan 5 小时 44 分钟前
很简单的需求, 不就是一个表记录 id, room_id, datetime, temperature 吗? 每分钟一次的记录, mysql 哪里承受不了这点数据了? 我自己用的还记录了湿度和气压呢, 完全没问题.


sql 怎么写?也很简单,要取一分钟的直接按时间来就行了。

去间隔 5 分钟的?当前分钟数%5=余数
where datetime%5=余数

以此类推(还有更复杂,更简单的写法吧,只是哥哥不会。。)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/599018

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX