需求:
室内温度实时监控
1.展示近 30 分钟内的实时室内温度(比如 11:30, 11:31 的温度分别是多少)
2.展示同一时刻的近 7 天的温度变化(比如现在是 11:30,需要展示的是往前共计 6 天的 11:30 的温度)
请教下这种需求的数据库应该怎么设计啊?
要展示近七天历史的每分钟的室内温度,总不能在数据库给每分钟都建立一个字段吧....请大家赐教
![]() |
1
OctopusGO 90 天前 via Android
这个记录分钟不可以么?
|
2
ali727 90 天前
id|create_date|temp 不就完事了?
|
![]() |
3
ycz0926 90 天前
nosql 不就行了
|
4
lolizeppelin 90 天前 ♥ 5
直接用 pg 的 timescaledb 啊,直接 time bulk 处理
这种最适合时序数据库了,不要坚持 mysql 了,不行的 |
![]() |
5
chendy 90 天前
时序数据
模仿时序数据库的思路做就行了 |
7
gavindexu 90 天前 via iPhone
@kayseen 一个 datetime 字段就行了啊,
自增 id,时间字段,温度,[温度记录仪放置位置],再加一个 timestamp 的录库时间👀 |
![]() |
8
crayygy 90 天前 via Android
id; datetime; temperature
总感觉是不是对数据库的表结构有什么误解,日期和分钟只是一个时间数据,为什么需要每个分钟都建一个字段,难道我建立一个学生表还需要把每个学生的名字建一个字段不成? |
9
newtype0092 90 天前
你开个字段记时间戳就好了啊,为什么需要每分钟都建立一个字段?
看你应该是不太懂时间戳,一般这种记录都要带时间戳的,以后取的时候根据规则过滤就好了,mysql 用 from_unixtime 和 unix_timestamp 之类的函数可以很方便的转换。 |
![]() |
10
whatever93 90 天前 via Android
Influxdb 时序数据库
|
11
Raymon111111 90 天前 ♥ 1
其实是时序需求, 有专门的存储搞这个的
但是够简单, 数据足够小, mysql 一样可以 字段就是 id, time, temp 两个取的需求, 一个是 time 三十分钟内 第二个简单做直接 in 就行 time in ( now, now-secOneDay, now-secOneDay*2....) |
![]() |
12
kayseen 90 天前 via Android
@Raymon111111
@newtype0092 @crayygy @crayygy 这样建字段的话,就是一个房间,每分钟记录一条数据,每天记录 1440 条数据,如果房间在 20 左右的话,MySQL 压力可以吗? |
![]() |
13
loading 90 天前
时分秒各一列,这样你写 sql 也简单。
|
![]() |
15
opengps 90 天前 via Android
看我博客,最近重新提过,用关系型数据库模拟时序数据库效果,只有 2 列就可以,timestamp 列和数值列即可
|
16
xduanx 90 天前 via iPhone
参考 zabbix 的数据库设计
|
17
xduanx 90 天前 via iPhone
zabbix 里的 history_uint 表里就是每个几秒记一条记录
|
![]() |
18
gainsurier 90 天前
time tag_name value status
|
![]() |
19
Huelse 90 天前
一天 1440 分钟,一年也就 525,600 次记录,这点数据完全受的住
|
21
newtype0092 90 天前
@kayseen 你这点数据谈不上压力
|
![]() |
22
KomeijiSatori 90 天前
@kayseen MySQL 什么时候连这点数据都顶不住了
|
![]() |
23
opengps 90 天前 ♥ 1
@kayseen
[分享一个我用过的压测 SqlServer 写入能力的方法代码]( https://www.opengps.cn/Blog/View.aspx?id=422) [mysql,sqlserver 数据库单表数据过大的处理方式]( https://www.opengps.cn/Blog/View.aspx?id=284) |
25
vincenttone 90 天前
每分钟记录一次没什么问题,60 * 24 * 7 = 10080 一周才一万条记录,就算你记上一年闰年也才 524040,50w 条。
如果你磁盘实在是小,那你起个脚本定时清理一下一周前的记录也就完事了,一直保持 10080 条就可以了。 |
26
lolizeppelin 90 天前
不想改代码就用 maxwell 把数据实时转发就是,不影响线上记录相关代码
跳出来海阔天空啊! |
27
sayhier 90 天前 via iPhone
我再把问题延伸一下啊,其实这是个物联网问题,假设数据不止温度一个,也不止从一个地方发来数据,应该如何设计
|
![]() |
28
hjmeteor 90 天前 via Android
为什么不参考下气象探测(采集)呢?每一条记录固定格式,把字节分配下,比如时间(举例 YYYYMMDDHHMM )、房间号、要素值,使用时读取、适当的转换即可。
|
![]() |
29
Huelse 90 天前
其实也可以考虑 nginx 那样的写日志文件
|
![]() |
30
GreyYang 90 天前
建议 influxdb. 这个需求比较合适.
|
![]() |
31
starsriver 90 天前 via Android
为什么要 mysql。
这么点数据 直接文件存 |
![]() |
32
Sasasu 90 天前
时序数据库都有很强的压缩,比直接用关系数据库能省至少 75% 的硬盘
|
![]() |
35
GreyYang 90 天前
@kayseen python 操作方便, 参考: https://github.com/influxdata/influxdb-python ; 可视化可以使用原生的 chronograf https://www.influxdata.com/time-series-platform/chronograf/ ; 整套解决方案可以使用 tick 技术栈: telegraf + influxdb + chronograf + kapacitor, 满足数据采集, 存储, 时序数据分析, 报警, 可视化整套需求. 缺点: 集群收费...很贵. 不过单机性能已经很强了, 一般数据量不是特别大应该 ok.
|
![]() |
36
autogen 90 天前
我觉得 excel 都可以。。。
|
![]() |
38
Pythondr 89 天前 via Android
时序数据库,influxDB
|
39
ninjachen 89 天前 via Android
其实他除了原始数据还有个统计需求。
你先记录原始数据,然后每分钟跑个 cron 统计上一分钟的数据,记在新表里,他们业务是不一样的,用 rdbms 的话不能存一起。 |
40
daozhihun 89 天前 via Android
如果你的项目要用到 MySQL,不建议楼上有些人说的那样另搞一个时序数据库,反而增加复杂度。这点数据量没什么压力,顶多一年一次给旧数据挪窝就行。
如果没有用到 MySQL,倒是可以考虑用类时序数据库来存储。 |
41
deepdark 89 天前 via Android
这么点数据,txt 都存了
|
![]() |
42
code2019 89 天前 via iPhone
influxdb 时序数据库了解一下
|
![]() |
43
silvernoo 89 天前
rrdtool
|
44
CallMeReznov 89 天前
@opengps #23 好东西啊,兄弟
|
45
himesens 89 天前
一分钟存一行,至于怎么取其中某个站点最新 30 行,和隔 1440 行取一条,后台处理,一分钟刷一次,表字段越少越好。你甚至可以一次查完七天近万条数据循环+1 解决,整个处理时间都不会超过 1 秒。
|
46
leafre 89 天前
有难点吗?
|
![]() |
47
Aresxue 89 天前
当前没必要引入时序数据库,less is more。
mysql 的话就按一分钟一条数据存储好了,如果后期数据量真的大起来,那就把近来七天的数据作为热点数据放到缓存里,过期时间设为七天,性能这方面完全不会有啥问题。 |
48
EricInBj 89 天前
用 influxdb
|
![]() |
49
keakon 89 天前
clickhouse
|
![]() |
50
zjyl1994 89 天前
正常存 datetime 就行了,select 的时候提前算好了对应的时间点进去 wherein 就能提出来对应的数据
|
51
GTim 89 天前
楼上各位推荐 influxdb 是认真的吗??????
如果是精确到分,只有一个温度计,完全可以用 bigint(20) 来表示时间 1909091010 算上温度 float 或者 decimal 就算 1000w 条数据,空间也是小的可怜好吗 如果不止一个设备,再加一个 did 设备编号,8 + 4 + 4 字节 = 16 字节 |
52
GTim 89 天前
@Aresxue 数据量根本就不大,这个表最多只有 5 个字段,自增 id + 时间戳 + 温度 + date(ymdhi) + 设备 id 只需要 24 字节,1g 理论上能存 4kw 数据
|
54
GTim 89 天前
@Aresxue 细腻到 ms 或 ns 也就是 bigint 的问题,时间戳 * 1000 或者 1000000 就可以了,至于烟感、雾感,不能放这个表,不然插入太频繁会掉性能。
|
55
w516322644 89 天前
@crayygy 这有啥误解的,数据多的时候,你时间戳还得处理下,有分钟字段的话,可以直接查。
|
56
JosephHan 89 天前
很简单的需求, 不就是一个表记录 id, room_id, datetime, temperature 吗? 每分钟一次的记录, mysql 哪里承受不了这点数据了? 我自己用的还记录了湿度和气压呢, 完全没问题.
|
57
ZXCDFGTYU 89 天前
时序数据库足够了,mysql 的话就按楼上说的就 ok
|
![]() |
58
Aresxue 89 天前
@GTim 我说的 ms、ns 是针对你回复我数据量不大的,改成 ms、ns 主要是数据量的上升,比如 ms 就是 60*100 倍的数据量了,这时候数据量就很可观了,要考虑下性能的问题了。烟感雾感也只是举例子后续可能的扩展性问题,当然不可能直接加进去,但是你一张表只放一类数据对于 mysql 来说是很浪费的。
|
59
ai88030669 89 天前
我觉得 你问的东西 有问题 我想你问的是 sql 怎么写吧...
|
60
skyqqcc 89 天前 via Android
感谢回复者 Reply 56
JosephHan 5 小时 44 分钟前 很简单的需求, 不就是一个表记录 id, room_id, datetime, temperature 吗? 每分钟一次的记录, mysql 哪里承受不了这点数据了? 我自己用的还记录了湿度和气压呢, 完全没问题. sql 怎么写?也很简单,要取一分钟的直接按时间来就行了。 去间隔 5 分钟的?当前分钟数%5=余数 where datetime%5=余数 以此类推(还有更复杂,更简单的写法吧,只是哥哥不会。。) |
![]() |
61
kayseen 89 天前
@deepdark
@starsriver 请问,如果直接存 txt 文件的话,我也给每一行数据分配了 datetime 字段, 把每天的数据存为一个文件,那么怎么筛选出 txt 文件中的昨天和前天的同一时刻的温度呢? 文件操作可以筛选时间吗? |
![]() |
62
quadrapop 89 天前
5 秒钟一条数据,现在表已经 2 亿数据了。。 也是 mysql
|
![]() |
63
www5070504 89 天前
推荐一波 influxdb 时序的
|
![]() |
64
starsriver 89 天前 via Android
使用 xml 或 json 结构化的文档存储信息。不是说直接一行一条数据。
|
65
liang2u 89 天前 via Android
@kayseen 没说全存一个文件里面,按天存或者按小时存,自己定规则,自己写逻辑去读,时间点对应的行号都可以根据自己的规则去推导,程序员的乐趣不就是折腾。
|
66
phantomzz 89 天前 via Android
Influxdb 或者 prometheus
|
67
MonoLogueChi 89 天前 via Android
一分钟记录一条,怕机器顶不住就半年分一次表
|
68
a852695 89 天前
我觉得这个问题是很简单,忍不住了,还是自己看看什么是数据库?
|
![]() |
69
leavic 89 天前
感觉楼主是来骗毕业设计的
|
![]() |
70
cshlxm 89 天前
试试 tdengine 国产的开源时序数据库,看上去很厉害
|
71
irvinghua 88 天前
你们楼上,都无视部署、开发成本啊,动不动就推荐重量级的大型数据库。10 年累计下来也只要: 60*24*365*10=525.6W 条,就这点小数据量 MySQL 分表都不用,毫无压力
|
72
irvinghua 88 天前
人家自己想动手 DIY 做个小玩具,你叫别人买七轴联动的高精尖机床加工的既视感
|
![]() |
73
Breadykid 88 天前
完全不用关系型数据库,nosql 或者缓存都行
|
![]() |
74
evlos 86 天前
用 influxdb 吧
|