gpt4 book ai didi

database - 传感器数据的数据库设计(大量数据)

转载 作者:搜寻专家 更新时间:2023-10-30 20:37:50 25 4
gpt4 key购买 nike

我正在编写一个用于查看和管理传感器数据的应用程序。我可以拥有无​​限数量的传感器,每个传感器每分钟读取一次并将值记录为(时间、值、传感器_id、位置_id、[一堆其他 double ])。

例如,我可能有 1000 个传感器并每分钟为每个传感器收集数据,一年后最终生成 525,600,000 行。多个用户(比如最多 20 个)可以同时绘制任何时间段的数据,在任何范围内放大和缩小,并为传感器的数据添加注释。用户还可以修改某些数据点,我需要跟踪原始数据和修改后的数据。

我不确定像这样的应用程序的数据库应该是什么样子!它应该只是一个表 SensorData,带有时间和 sensor_id 和 location_id 的索引吗?我应该根据 sensor_id 对这个单表进行分区吗?我应该每天将数据保存在每个传感器的文件中(比如 .csv 文件)并根据要求将它们加载到临时表中吗?我应该如何管理注释?

我还没有决定使用 DBMS(可能是 MySQL 或 PostgreSQL)。但我的目的是深入了解此类应用程序中的数据管理。

最佳答案

我假设用户无法更改您显示的字段(时间、值、sensor_id、location_id),但其他字段隐含。

在这种情况下,我建议使用 Version Normal Form。您命名的字段是静态的,也就是说,一旦输入,它们就永远不会改变。但是,许多用户可以更改其他字段。

您无法说明用户是看到所有用户的更改还是只看到他们自己的更改。我将假设所有用户都可以看到所有更改。如果该假设错误,您应该能够做出适当的更改。

首先,让我们解释一下 Version Normal Form。正如您将看到的,它只是第二范式的一个特例。

获取您命名的字段的元组,重新排列以将键值组合在一起:

R1( sensor_id(k), time(k), location_id, value )

如您所见,location_id(假设传感器是可移动的)和值取决于生成值的传感器和进行测量的时间。这个元组在 2nf 中。

现在你想添加可更新的字段:

R2( sensor_id(k), time(k), location_id, value, user_id, date_updated, ... )

但是可更新字段(包含在省略号中)不仅依赖于原始键字段,还依赖于 user_id 和 date_updated。元组不再在 2nf 中。

因此我们不将新字段添加到原始元组中,而是创建一个规范化的元组:

R1( sensor_id(k), time(k), location_id, value )
Rv( sensor_id(k), time(k), user_id(k), date_updated(k), ... )

这使得每个原始阅读都有一系列任意数量的版本成为可能。

查询特定阅读的最新更新:

select  R1.sensor_id, R1.time, R1.location_id, R1.value, R2.user_id, R2.date_updated, R2.[...]
from R1
left join Rv as R2
on R2.sensor_id = R1.sensor_id
and R2.time = R1.time
and R2.date_updated =(
select max( date_update )
from Rv
where sensor_id = R2.sensor_id
and time = R2.time )
where R1.sensor_id = :ThisSensor
and R1.time = :ThisTime;

要查询特定用户的特定阅读的最新更新,只需将 user_id 值添加到主查询和子查询的过滤条件中即可。应该很容易看出如何获取特定阅读的所有更新或特定用户所做的更新。

这种设计在您访问数据的方式上非常灵活,并且因为关键字段也被索引,所以即使在非常大的表上也非常快。

关于database - 传感器数据的数据库设计(大量数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32526421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com